Les chronomètres

 

 

Les chronomètres seront utiles pour vérifier par exemple le temps que peut prendre un traitement, l'affichage d'un écran ou tout simplement pour synchroniser un jeu. En aucun cas on cherchera à afficher l'heure avec ce genre de fonction, ce n'est pas fait pour !

Il existe 3 types de timer:


Le timer de base:

GetTickCount() qui n'attend aucun paramètre.

Cette fonction retourne le nombre de millisecondes écoulées depuis le lancement du système.

Cette fonction retournant un DWORD, le compteur reviendra à zéro au bout de 49,7 jours...je vous laisse le vérifier !

Syntaxe:

DWORD GetTickCount(VOID);

Il est possible de récupérer des informations sur ce timer via
BOOL GetSystemTimeAdjustment(
PDWORD lpTimeAdjustment,
PDWORD lpTimeIncrement,
PBOOL lpTimeAdjustmentDisabled
);

La fonction retourne 0 si erreur.

En entrée:
lpTimeAdjustment qui est un nombre qu'il faut multiplier par 100 nanosecondes. Indique au bout de combien de centaines de nanosecondes le tic va se déclencher.

lpTimeIncrement valeur d'incrémentation en centaines de nanosecondes de l'horloge.

lpTimeAdjustmentDisabled pour indiquer que lpTimeAdjustment est actif ou non.

Il est possible de changer ces valeurs d'ajustement via

BOOL SetSystemTimeAdjustment(
DWORD dwTimeAdjustment,
BOOL bTimeAdjustmentDisabled
);

Personnellement, je ne l'ai jamais utilisé...

La fonction retourne 0 si erreur.

Voici un exemple d'utilisation:

Affichage de rectangles et d'ellipses à l'écran et affichage du temps pris pour effectuer l'opération. (Voir chapitre sur le GDI, le graphisme. Je suis reparti du dernier exemple de ce chapitre)

Remarque, suivant les performances de votre carte graphique, il faudra soit augmenter le nombre de figures à afficher, soit le diminuer. Pour cela, voyez la boucle for each dans WM_PAINT.

Image non trouvée !


Le timer multimédia

Il faudra pour l'utiliser définir la librairie WinMM.Lib sous Windows c++

Vous aurez aussi besoin de l'include #include <mmsystem.h>

Cette fonction retourne aussi le nombre de millisecondes écoulées depuis le lancement du système.

On peut connaître les réglages du timer par la fonction timeGetDevCaps:

MMRESULT timeGetDevCaps(
LPTIMECAPS ptc,
UINT cbtc
);

En entrée:
ptc pointeur sur une structure de type TIMECAPS. Cette structure sera renseignée avec les valeurs de résolution du timer.

cbtc Taille en octet de la structure TIMECAPS

En sortie TIMERR_NOERROR si pas d'erreur ou TIMERR_STRUCT Si la fonction ne parvient pas à récupérer les informations.


A partir de là, il sera possible de régler la valeur minimale de la résolution:
MMRESULT timeBeginPeriod(
UINT uPeriod
);

Avec uPeriod qui devra être compris entre les valeurs min. et maxi retournées par timeGetDevCaps.

En sortie:
TIMERR_NOERROR si tout est ok, sinon TIMERR_NOCANDO si la valeur est incorrecte.

Attention, il est impératif de remettre la valeur d'origine de la résolution en utilisant

MMRESULT timeEndPeriod(
UINT uPeriod
);

Avec uPeriod correspondant à la valeur passée dans timeBeginPeriod.

TIMERR_NOERROR si tout est ok, sinon TIMERR_NOCANDO si la valeur est incorrecte.


Enfin, la commande DWORD timeGetTime(VOID); qui retourne le nombre de millisecondes écoulées depuis le démarrage du système.

Cette fonction sera à placer entre timeBeginPeriod et timeEndPeriod si vous modifiez la résolution.

Voici un exemple d'utilisation:

Toujours l'affichage de rectangles et d'ellipses à l'écran et affichage du temps pris pour effectuer l'opération (Voir chapitre sur le GDI, le graphisme. Je suis reparti du dernier exemple de ce chapitre).

Toujours la même remarque, suivant les performances de votre carte graphique, il faudra soit augmenter le nombre de figures à afficher, soit le diminuer. Pour cela, voyez la boucle for each dans WM_PAINT.

Image non trouvée !


Enfin, le timer haute précision:

Vous pourrez là aussi interroger le système afin de connaître les performances de ce timer.
QueryPerformanceFrequency

BOOL QueryPerformanceFrequency(
LARGE_INTEGER *lpFrequency
);

En sortie
lpFrequency pointe sur une variable qui reçoit la fréquence courante du compteur (Valeur d'un compteur au bout d'une seconde écoulée). Si cette valeur est à 0, alors le système ne possède pas ce timer.

En sortie, la fonction retourne 0 si erreur.

Pour lire la valeur courante, on utilisera BOOL QueryPerformanceCounter(
LARGE_INTEGER *lpPerformanceCount
);

Avec lpPerformanceCount un pointeur sur une variable contenant la valeur du compteur.

Voici un exemple d'utilisation:

Toujours l'affichage de rectangles et d'ellipses à l'écran et affichage du temps pris pour effectuer l'opération (Voir chapitre sur le GDI, le graphisme. Je suis reparti du dernier exemple de ce chapitre).

Toujours la même remarque, suivant les performances de votre carte graphique, il faudra soit augmenter le nombre de figures à afficher, soit le diminuer. Pour cela, voyez la boucle for each dans WM_PAINT.

Image non trouvée !