begin process at 2012 05 27 21:00:23
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Multimédia

 > TOUS LES TIMER (CHRONOMÉTRES)

TOUS LES TIMER (CHRONOMÉTRES)


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :12 206 / 450

Auteur : cyrcocq

Ecrire un message privé
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

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources de la même categorie

Source avec Zip ADAPTER LES TEMPS DE SUBTITLES DE SOUS TITRAGE ENTRE DEUX LA... par berrami
Source avec Zip Source avec une capture DÉTECTION DE VISAGE (YEUX, NEZ, BOUCHE) AVEC OPENCV EN TEMPS... par MadM@tt
Source avec Zip Source avec une capture GÉNÉRATEUR FM EXPÉRIMENTAL par tontonCD
Source avec Zip LECTEUR MULTIMÉDIA par omegatou
Source avec Zip IMPLÉMENTATION D'UN ALGORITHME DE COMPRESSION/DECOMPRESSION ... par eemikhm

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture LOGICIEL AGENDA PLANNING par BencoAndCo
Source avec une capture POWER MATH: TESTE DE VITESSE ENTIERS VS REELS , CLASS VS STR... par dedalusman
Source avec Zip Source avec une capture LA FRANCE (DEVCPP) par gagah1
Source avec Zip TIMER par tibur
Source avec Zip CLASSE TIMER - CHRONOMÉTRER LE TEMPS D'EXÉCUTION D'UNE FONCT... par playmo420

Commentaires et avis

Commentaire de magic_Nono le 06/09/2005 23:34:14

se reporter également aux sources de BruNews sur le sujet

Magicalement

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

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,437 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales