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.
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.
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.