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 éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 655
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 655
    Points : 11 150
    Points
    11 150
    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 : 50
    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
    Points : 16 213
    Points
    16 213
    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.

  3. #3
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 655
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 655
    Points : 11 150
    Points
    11 150
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(stop-current > 0)
    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 : 50
    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
    Points : 16 213
    Points
    16 213
    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.

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Voir aussi ce post qui rejoint cette discussion sur l'attente active et les timers précis.

  7. #7
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 655
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 655
    Points : 11 150
    Points
    11 150
    Par défaut
    merci pour ces précisions

  8. #8
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 655
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 655
    Points : 11 150
    Points
    11 150
    Par défaut
    Citation Envoyé par screetch Voir le message
    utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(stop-current > 0)
    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, 13h37
  2. Question existentielle : les commentaires
    Par ®om dans le forum Langage
    Réponses: 1
    Dernier message: 08/06/2006, 01h20
  3. Question existentielle
    Par jadey dans le forum C++
    Réponses: 12
    Dernier message: 21/04/2006, 16h00
  4. Question existentielle : Que signifie X dans MAC oS X?
    Par oOoOuuhmAn dans le forum Apple
    Réponses: 8
    Dernier message: 03/04/2006, 12h37

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