IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

Threads & Processus C++ Discussion :

QueryPerformanceCounter : question existentielle :aie:


Sujet :

Threads & Processus C++

  1. #1
    Expert confirm�
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par d�faut QueryPerformanceCounter : question existentielle :aie:
    bonjour,


    je cherche � r�aliser un chronom�tre relativement pr�cis. Les fonctions Sleep() et clock() ne donnant pas satisfaction, je me suis rabattu sur les fonctions QueryPerformanceFrequency et QueryPerformanceCounter.

    Si j'ai bien compris la doc de QueryPerformanceCounter, la fonction prend un param�tre LARGE_INTEGER (entier 64 bits) et ce compteur est incr�ment� � la fr�quence retourn�e par QueryPerformanceFrequency .


    On peut donc ainsi r�aliser des chronom�tres assez pr�cis
    Code C++ : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
        LARGE_INTEGER Start;
        LARGE_INTEGER Stop;
        LARGE_INTEGER Current;
        LARGE_INTEGER proc_freq;
        int duree;
     
        duree = 20;
     
     
        QueryPerformanceFrequency(&proc_freq);
        QueryPerformanceCounter(&Start);
     
     
        Stop.QuadPart = Start.QuadPart + LONGLONG( (duree * proc_freq.QuadPart * 1.0) / 1000.0);
     
        do
        {
            QueryPerformanceCounter(&Current);
        }while (Current.QuadPart < Stop.QuadPart);


    Mais quelque chose me g�ne....

    En informatique un entier, qu'il soit cod� sur 8, 16 ou 64 bits est born�.....
    Donc en toute logique � un moment ou � un autre ma variable Current va atteindre son maximum et (si je ne me trompe pas) lors du prochain tic repassera � 0.

    Du coup dans ma boucle si Current repasse � 0
    Code c++ : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
     
        do
        {
            QueryPerformanceCounter(&Current);
        }while (Current.QuadPart < Stop.QuadPart);

    ma condition d'arr�t sera fausse ???? Non ?

  2. #2
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Citation Envoy� par Auteur Voir le message
    Code c++ : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
     
        do
        {
            QueryPerformanceCounter(&Current);
        }while (Current.QuadPart < Stop.QuadPart);
    Ouch, tu as l� une attente active : Pendant l'attente, le processeur va tourner � fond, emp�cher d'autres programmes de s'ex�cuter, consommer plein d'�nergie et r�chauffer le climat ! A �viter absolument !

    A part �a, pour ton probl�me, en th�orie, tu as raison. En pratique, � moins d'attendre vraiment longtemps.... Par exemple, si ton compteur est � 3GHz, c'est au bout de 194 ans que le probl�me arrivera.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  3. #3
    Expert confirm�
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par d�faut
    Citation Envoy� par JolyLoic Voir le message
    [...]pour ton probl�me, en th�orie, tu as raison. En pratique, � moins d'attendre vraiment longtemps.... Par exemple, si ton compteur est � 3GHz, c'est au bout de 194 ans que le probl�me arrivera.
    donc j'ai de la marge


    Citation Envoy� par JolyLoic Voir le message
    Ouch, tu as l� une attente active : Pendant l'attente, le processeur va tourner � fond, emp�cher d'autres programmes de s'ex�cuter, [...] A �viter absolument !
    Certes je sais que l'attente est active mais dans cette boucle j'emp�che r�ellement les autres programmes de s'ex�cuter ?
    Je voudrais quand m�me �viter de passer par un thread pour r�aliser ce chrono dans la mesure o� je cherche � avoir une tr�s grande pr�cision (je suis � 1 ms pr�s).

  4. #4
    screetch
    Invit�(e)
    Par d�faut
    utilise a la place ce qui va recreer un entier proche de 0 meme si stop ou current va boucler

    pour une attente pr�cise ce que tu peux faire c'est

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    if(timeToWait > 5ms)
    {
      sleep(timeToWait-1ms);
    }
    while(stopTime-currentTime > 0) /*attente active*/;
    c'est a dire que tu endors le programme pendant un long moment si jamais il y a beaucoup a attendre, puis tu attends activement.

  5. #5
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Citation Envoy� par Auteur Voir le message
    Certes je sais que l'attente est active mais dans cette boucle j'emp�che r�ellement les autres programmes de s'ex�cuter ?
    Sur une machine monoprocesseur, tu vas les asphyxier.
    Citation Envoy� par Auteur Voir le message
    Je voudrais quand m�me �viter de passer par un thread pour r�aliser ce chrono dans la mesure o� je cherche � avoir une tr�s grande pr�cision (je suis � 1 ms pr�s).
    Alors, il te faudrait envisager de passer � un OS temps r�el, car 1ms, c'est vraiment limite pour windows. Il suffit que l'OS fasse autre chose (et il fera d'autres choses, m�me si tu augmentes la priorit� de ton process, � moins de tant la monter que m�me la gestion de la souris sera bloqu�e par ton processus) pour que tu loupes le bon moment.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    D�tails du profil
    Informations personnelles :
    �ge : 51
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par d�faut
    Voir aussi ce post qui rejoint cette discussion sur l'attente active et les timers pr�cis.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au s�rieux, de toutes fa�ons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum ad�quat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  7. #7
    Expert confirm�
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par d�faut
    merci pour ces pr�cisions

  8. #8
    Expert confirm�
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par d�faut
    Citation Envoy� par screetch Voir le message
    utilise a la place ce qui va recreer un entier proche de 0 meme si stop ou current va boucler

    pour une attente pr�cise ce que tu peux faire c'est

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    if(timeToWait > 5ms)
    {
      sleep(timeToWait-1ms);
    }
    while(stopTime-currentTime > 0) /*attente active*/;
    c'est a dire que tu endors le programme pendant un long moment si jamais il y a beaucoup a attendre, puis tu attends activement.
    Pour r�pondre � screetch dont j'avais zapp� le message
    C'est certes une possibilit� mais dans mon cas c'est inutile � impl�menter :
    mes pulses font dans 98% des cas 2ms. Donc la condition (timeToWait > 5ms) ne sera quasiment jamais valid�e

    En plus Sleep a une pr�cision qui varie entre 1 et 2ms (voire 3ms), et dans mon cas n'est pas acceptable : si j'envoie un pulse de 2ms, il doit faire 2ms.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Petite question existentielle (hum hum)
    Par Emplyst dans le forum Langage
    R�ponses: 33
    Dernier message: 06/07/2006, 12h37
  2. Question existentielle : les commentaires
    Par �om dans le forum Langage
    R�ponses: 1
    Dernier message: 08/06/2006, 00h20
  3. Question existentielle
    Par jadey dans le forum C++
    R�ponses: 12
    Dernier message: 21/04/2006, 15h00
  4. Question existentielle : Que signifie X dans MAC oS X?
    Par oOoOuuhmAn dans le forum Apple
    R�ponses: 8
    Dernier message: 03/04/2006, 11h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo