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 ?
Partager