Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TOUS LES TIMER (CHRONOMÉTRES)


Information sur la source

Catégorie :Multimédia Classé sous : timer, chronomètres, temps, gettickcount, tickcount Niveau : Débutant Date de création : 04/09/2005 Vu / téléchargé: 7 830 / 376

Note :
9 / 10 - par 2 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

Description

Un code peut être inutile peut être peu portable.
Mais j'étais à la recherche des differentes méthodes pour chronométrer le déroulement de mes programmes.

Alors, là, on à les trois types de timer
celui de l'horloge GetTickCount
le Multimédia (timeGetTime) ses possibilités (timeGetDevCaps) ses réglages (timeBeginPeriod) et sa fin d'utilisation (timeEndPeriod)
Le haute résolution (QueryPerformanceCounter) et sa fréquence (QueryPerformanceFrequency).

Mal commenté probablement mais bon...
 

Source

  • #include <windows.h>
  • #include <iostream>
  • #include <string>
  • #include <sstream>
  • #include <mmsystem.h>
  • using namespace std;
  • int APIENTRY WinMain(HINSTANCE hInstance,
  • HINSTANCE hPrevInstance,
  • LPSTR lpCmdLine,
  • int nCmdShow)
  • {
  • int retour;
  • string titre = "infos sur l'horloge de la machine";
  • const char *c_titre = titre.c_str ( );
  • /*
  • ** Le timer de base.
  • ** Obtenu par le fameux GetTickCount()
  • */
  • {
  • // récupération de la résolution du timer
  • PDWORD TAdjust=new DWORD;
  • PDWORD TIncre=new DWORD;
  • PBOOL TDisabled=new BOOL;
  • BOOL B_Syst=GetSystemTimeAdjustment(TAdjust,TIncre,TDisabled); // le TDisabled
  • //Initialisation d'une chaine d'affichage
  • ostringstream oss;
  • oss << "En ce qui concerne l'horloge de base (gérée par GetTickCount())" << endl;
  • oss << "Un tick a lieu toutes les " << *TAdjust/10 << " microsecondes." << endl;
  • oss << "L'horloge s'incrémente par " << *TIncre << " 100aines de nanosecondes." << endl;
  • do // une boucle répétant plusieurs fois...
  • {
  • DWORD val1,val2;
  • unsigned int compteur=0;
  • val2 = GetTickCount(); //on récupére la valeur de l'horloge dans val2
  • do
  • {
  • val1 = GetTickCount(); // puis dans val1
  • }
  • while (val1==val2); // Et dès qu'elle change
  • do
  • {
  • val2 = GetTickCount(); //on recommence à la récupérer dans val2
  • compteur++; // en incrementant un compteur
  • }
  • while (val1==val2); // jusqu'à ce qu'elle change à nouveau.
  • oss << "Il a fallu " << compteur << " itérations pour passer de " << val1 << " à " << val2 << " soit " << val2-val1 << " ms" << endl;
  • string message = oss.str();
  • const char *c_message = message.c_str ( );
  • retour = MessageBox(NULL, c_message, c_titre, MB_RETRYCANCEL);
  • }
  • while (retour!=IDCANCEL);
  • delete TAdjust;
  • delete TIncre;
  • delete TDisabled;
  • }
  • /*
  • ** le timer multimedia
  • ** obtenu par timeGetTime() et réglé par timeBeginPeriod() et timeEndPeriod()
  • */
  • {
  • ostringstream oss;
  • // récupération des infos sur la précision du timer multimédia
  • TIMECAPS tc;
  • if (timeGetDevCaps (&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR)
  • MessageBox(NULL, "il y a une erreur! Le timer multimédia est indisponible.", c_titre, MB_OK);
  • else
  • {
  • oss << endl << "Le timer multimédia à une résolution minimum de " << tc.wPeriodMin << "ms" << endl;
  • oss << "Et une résolution max de " << tc.wPeriodMax << "ms" << endl;
  • // Test comparaison de la perf par défaut
  • // Ce timer semble avoir la même résolution (pas toujours!) que
  • // l'horloge de base mais perd plus de temps pour ses appels
  • do //Même prinicipe que la boucle précédente.
  • {
  • DWORD val1,val2;
  • unsigned int compteur;
  • compteur=0;
  • val2 = timeGetTime();
  • do
  • {
  • val1 = timeGetTime();
  • }
  • while (val1==val2);
  • do
  • {
  • val2 = timeGetTime();
  • compteur++;
  • }
  • while (val1==val2);
  • oss << "Il a fallu " << compteur << " itérations pour passer de " << val1 << " à " << val2 << " soit " << val2-val1 << " ms" << endl;
  • string message = oss.str();
  • const char *c_message = message.c_str ( );
  • retour = MessageBox(NULL, c_message, c_titre, MB_RETRYCANCEL);
  • }
  • while (retour!=IDCANCEL);
  • // Passage du timer à sa meilleure résolution
  • timeBeginPeriod(tc.wPeriodMin);
  • oss << endl << "Si on passe la résolution à " << tc.wPeriodMin << "ms" << endl;
  • do //Même prinicipe que la boucle précédente.
  • {
  • DWORD val1,val2;
  • unsigned int compteur;
  • compteur=0;
  • val2 = timeGetTime();
  • do
  • {
  • val1 = timeGetTime();
  • }
  • while (val1==val2);
  • do
  • {
  • val2 = timeGetTime();
  • compteur++;
  • }
  • while (val1==val2);
  • oss << "Il a fallu " << compteur << " itérations pour passer de " << val1 << " à " << val2 << " soit " << val2-val1 << " ms" << endl;
  • string message = oss.str();
  • const char *c_message = message.c_str ( );
  • retour = MessageBox(NULL, c_message, c_titre, MB_RETRYCANCEL);
  • }
  • while (retour!=IDCANCEL);
  • // On remet le timer dans l'état ou on l'a trouvé
  • // (en utilisant le même paramétre sous peine de ne plus avoir les performances choisies)
  • timeEndPeriod(tc.wPeriodMin);
  • }
  • }
  • /*
  • ** le timer Haute résolution (high-resolution timer)
  • ** lu par QueryPerformanceCounter
  • ** et dont les performances sont indiquées par QueryPerformanceFrequency
  • */
  • {
  • ostringstream oss;
  • // récupération des infos sur la précision du high-resolution timer
  • LARGE_INTEGER Frequency;
  • if (!QueryPerformanceFrequency(&Frequency))
  • MessageBox(NULL, "il y a une erreur! Le timer haute résolution est indisponible.", c_titre, MB_OK);
  • else
  • {
  • oss << endl << "Le timer haute résolution compte " << Frequency.QuadPart << "fois par secondes" << endl;
  • do
  • {
  • LARGE_INTEGER val1,val2,val3;
  • //intérogations successives du compteur
  • QueryPerformanceCounter(&val1);
  • QueryPerformanceCounter(&val2);
  • QueryPerformanceCounter(&val3);
  • oss << "3 lectures successives de ce compteur donnent : " << endl;
  • oss << val1.QuadPart << " puis ";
  • oss << val2.QuadPart << " (" << val2.QuadPart-val1.QuadPart << " \"count\" plus loin.)" << " puis ";
  • oss << val3.QuadPart << " (" << val3.QuadPart-val2.QuadPart << " \"count\" plus loin.)" << endl;
  • oss << "Il s'est donc écoulé " << (double)(val3.QuadPart-val1.QuadPart)/(double)Frequency.QuadPart
  • << " secondes entre la premiére et la 3e lecture." << endl;
  • string message = oss.str();
  • const char *c_message = message.c_str ( );
  • retour = MessageBox(NULL, c_message, c_titre, MB_RETRYCANCEL);
  • }
  • while (retour!=IDCANCEL);
  • }
  • }
  • return(0);
  • }
#include <windows.h>

#include <iostream> 
#include <string> 
#include <sstream>
#include <mmsystem.h>

using namespace std;

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
	int retour;
	
	string titre = "infos sur l'horloge de la machine";
	const char *c_titre = titre.c_str ( );

/*
** Le timer de base.
** Obtenu par le fameux GetTickCount()
*/	



	{
		// récupération de la résolution du timer
		PDWORD TAdjust=new DWORD;
		PDWORD TIncre=new DWORD;
		PBOOL TDisabled=new BOOL;
		BOOL B_Syst=GetSystemTimeAdjustment(TAdjust,TIncre,TDisabled); // le TDisabled
		
		//Initialisation d'une chaine d'affichage
		ostringstream oss;

		oss << "En ce qui concerne l'horloge de base (gérée par GetTickCount())" << endl;
		oss << "Un tick a lieu toutes les " << *TAdjust/10 << " microsecondes." << endl;
		oss << "L'horloge s'incrémente par " << *TIncre << " 100aines de nanosecondes." << endl;

	
		do // une boucle répétant plusieurs fois...
		{
			DWORD val1,val2;		
			unsigned int compteur=0;
			
			val2 = GetTickCount(); //on récupére la valeur de l'horloge dans val2
			do
			{ 
				val1 = GetTickCount(); // puis dans val1
			}
			while (val1==val2); // Et dès qu'elle change
			
			do
			{ 
				val2 = GetTickCount(); //on recommence à la récupérer dans val2
				compteur++; // en incrementant un compteur
			}
			while (val1==val2); // jusqu'à ce qu'elle change à nouveau.

			oss << "Il a fallu " << compteur << " itérations pour passer de " << val1 << " à " << val2 << " soit " << val2-val1 << " ms" << endl;

			string message = oss.str();
			const char *c_message = message.c_str ( );

			retour = MessageBox(NULL, c_message, c_titre, MB_RETRYCANCEL);
		}
		while (retour!=IDCANCEL);

		delete TAdjust;
		delete TIncre;
		delete TDisabled;

	}

/*
** le timer multimedia
** obtenu par timeGetTime() et réglé par timeBeginPeriod() et timeEndPeriod()
*/

	{
		ostringstream oss;
		

		// récupération des infos sur la précision du timer multimédia 
		TIMECAPS tc;
		if (timeGetDevCaps (&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR)
			MessageBox(NULL, "il y a une erreur! Le timer multimédia est indisponible.", c_titre, MB_OK);
		else
		{
            oss << endl << "Le timer multimédia à une résolution minimum de " << tc.wPeriodMin << "ms" << endl;
			oss << "Et une résolution max de " << tc.wPeriodMax << "ms" << endl;

			// Test comparaison de la perf par défaut
			// Ce timer semble avoir la même résolution (pas toujours!) que
			// l'horloge de base mais perd plus de temps pour ses appels

			do //Même prinicipe que la boucle précédente.
			{
				DWORD val1,val2;		
				unsigned int compteur;
				
				compteur=0;

				val2 = timeGetTime();
				do
				{ 
					val1 = timeGetTime();
				}
				while (val1==val2);
				
				do
				{ 
					val2 = timeGetTime();
					compteur++;
				}
				while (val1==val2);

				oss << "Il a fallu " << compteur << " itérations pour passer de " << val1 << " à " << val2 << " soit " << val2-val1 << " ms" << endl;

				string message = oss.str();
				const char *c_message = message.c_str ( );

				retour = MessageBox(NULL, c_message, c_titre, MB_RETRYCANCEL);
			}
			while (retour!=IDCANCEL);

			// Passage du timer à sa meilleure résolution
			timeBeginPeriod(tc.wPeriodMin);
			oss << endl << "Si on passe la résolution à " << tc.wPeriodMin << "ms" << endl;

			do //Même prinicipe que la boucle précédente.
			{
				DWORD val1,val2;		
				unsigned int compteur;
				
				compteur=0;

				val2 = timeGetTime();
				do
				{ 
					val1 = timeGetTime();
				}
				while (val1==val2);
				
				do
				{ 
					val2 = timeGetTime();
					compteur++;
				}
				while (val1==val2);

				
				
				oss << "Il a fallu " << compteur << " itérations pour passer de " << val1 << " à " << val2 << " soit " << val2-val1 << " ms" << endl;

				string message = oss.str();
				const char *c_message = message.c_str ( );

				retour = MessageBox(NULL, c_message, c_titre, MB_RETRYCANCEL);
			}
			while (retour!=IDCANCEL);
			
			// On remet le timer dans l'état ou on l'a trouvé 
			// (en utilisant le même paramétre sous peine de ne plus avoir les performances choisies)
			timeEndPeriod(tc.wPeriodMin);
		}
	}

/*
** le timer Haute résolution (high-resolution timer)
** lu par QueryPerformanceCounter
** et dont les performances sont indiquées par QueryPerformanceFrequency
*/

	{
		ostringstream oss;
		

		// récupération des infos sur la précision du high-resolution timer 
		LARGE_INTEGER Frequency;
		if (!QueryPerformanceFrequency(&Frequency))
			MessageBox(NULL, "il y a une erreur! Le timer haute résolution est indisponible.", c_titre, MB_OK);
		else
		{
            oss << endl << "Le timer haute résolution compte " << Frequency.QuadPart << "fois par secondes" << endl;

			do
			{
				LARGE_INTEGER val1,val2,val3;		
				
				//intérogations successives du compteur
				QueryPerformanceCounter(&val1);
				QueryPerformanceCounter(&val2);
				QueryPerformanceCounter(&val3);
				
				oss << "3 lectures successives de ce compteur donnent : " << endl;
				oss << val1.QuadPart << " puis ";
				oss << val2.QuadPart << " (" << val2.QuadPart-val1.QuadPart << " \"count\" plus loin.)" << " puis ";
				oss << val3.QuadPart << " (" << val3.QuadPart-val2.QuadPart << " \"count\" plus loin.)" << endl;
				oss << "Il s'est donc écoulé " << (double)(val3.QuadPart-val1.QuadPart)/(double)Frequency.QuadPart
					<< " secondes entre la premiére et la 3e lecture." << endl;


				string message = oss.str();
				const char *c_message = message.c_str ( );

				retour = MessageBox(NULL, c_message, c_titre, MB_RETRYCANCEL);
			}
			while (retour!=IDCANCEL);
		}
		
	}

	return(0);

}

Conclusion

Pour tourner, il faut la librairie WinMM.Lib
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de magic_Nono le 06/09/2005 23:34:14

se reporter également aux sources de BruNews sur le sujet

Magicalement

signaler à un administrateur
Commentaire de Afyn le 19/11/2005 10:31:07

Je suis pas réellement d'accord sur le Terme Timer.
Get Tick Count et QueryPerformance sont des compteurs !
SetTimer ou le Multimedia Timer sont des Timers ...

Bonne prog ...

Afyn - Navedac

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

new ... [ par payen ] bonjour,une petite question en ce qui concerne le calcul d'un temps : si je fais le code suivant, est ce que j'obtiens le temps REEL d'allocation?deb Timer - gestion du temps [ par aurelien2723 ] Salut!Je fais une application graphique qui va appeler différents programmes à intervalles différents, et réglables.J'aimerais savoir comment décompté Comment savoir le temps que prend un instruction? [ par Samoul ] Je voudrait savoir comment calculer a l'aide d'un chronomètre ou de nimporte quel autres manière le temps qye peut prendre un instruction.Ex:Timer sta MFC : marche pas tout le temps. [ par jefk ] Voila, j'ai un pbm zarbi. J'ai fait une application SDI bidon sous visual studio avec le wizzard MFC.Ya deux menus, chacun a un sous menu qui fait apa Utilisation de Timer [ par nunette ] Je fais clignoter un bouton sur l'appel de SetTimer, mon problème: impossible de le killer pourtant je passe bien le même id à KillTimer que celui pas Problème incompréhensible [ par JosueClement ] Regardez plutot...Ce programme est une sorte d'horloge!Il n'y a aucune erreur de compilation, mais les heures n'augmentent jamais!!A la ligne 54, j'ai bomberman avec turbo c++ [ par xav42 ] Bonjour, je suis étudiant et à mon iut on utilise turbo c++ qui date un peumais bon...Voici mon probleme :j'ai un projet pour la fin de l'annee: fair bomberman avec turbo c++ [ par xav42 ] Bonjour, je suis étudiant et à mon iut on utilise turbo c++ qui date un peumais bon...Voici mon probleme :j'ai un projet pour la fin de l'annee: fair fenetre jaune [ par Xs ] Salut !j'ai beau chercher dans toutes les API que je connaisse ou pas, je ne trouve comment faire pour lorsque,la souris reste un certain temps sur un C++ :J'ai cherché partout, VOUS ETES MON SEULE ESPOIR! Même mes profs n'y connaissent rien... [ par Amidala ] Ca fait des journées que j'y bosse, je cherche à trouver l'équivalent de la fonction "Sleep" ou "Wait" en Visual C++ 6.0. (introuvable dans la catégor


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,343 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.