IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Sleep() et Timer grande pr�cision


Sujet :

MFC

  1. #1
    Membre �clair�
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2006
    Messages
    245
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activit� : Directeur de projet
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Juin 2006
    Messages : 245
    Par d�faut Sleep() et Timer grande pr�cision
    Bonjour,

    Malgr� une recherche sur ce forum, je n'ai pas encore trouv� de solution � ma question.

    J'ai un petit probl�me sur les attentes de "grande" pr�cision.
    En effet, je veux faire, de mani�re pr�cise, une action toutes les 2 ms.

    J'ai donc commenc� par utiliser Sleep() qui, malheureusement, ne descend pas en dessous de 10 ms.
    Et j'ai alors pens� � utiliser les fonctions QueryPerformance...(), et effectivement, le compteur est nettement plus pr�cis.

    Mon probl�me est le suivant : compter c'est bien, attendre c'est mieux.
    Comment faire alors pour faire un timer qui ne mange pas 100% du CPU ?
    Un peu comme un Sleep(), ou un WaitForSingleObject() ou encore SetTimer()...

    Merci d'avance pour vos r�ponses

  2. #2
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    salut,
    le mieux serait d'utiliser les timer du noyau qui sont tr�s pr�cis avec : CreateWaitTimer et SetWaitableTimer.

  3. #3
    Membre �clair�
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2006
    Messages
    245
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activit� : Directeur de projet
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Juin 2006
    Messages : 245
    Par d�faut
    Merci pour ta r�ponse.

    J'avais oubli� de signaler que j'avais d�j� test� cette m�thode, mais je dois m'y prendre mal :
    Dans la fonction SetWaitableTimer, je n'arrive pas � r�utiliser le timer avec une p�riode de 2ms.

    Pourtant, je lui met en troisi�me argument 2...

    Merci d'avance

  4. #4
    Membre �clair�
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2006
    Messages
    245
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activit� : Directeur de projet
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Juin 2006
    Messages : 245
    Par d�faut
    Zut, j'avais oubli� de mettre mon code ...
    Voici donc ce que j'ai fait :

    Code : 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    void CALLBACK TimerProc(LPVOID lpArg, DWORD dwTimerLowValue, DWORD dwTimerHighValue )
    { 
    	printf("Atteint à %d\n", GetTickCount()); // appelé toutes les 2 millisecondes 
    } 
     
    void acqui(void *dummy)
    {
    	/* Mise en place du timer pour mettre à jour les valeurs */
    	long timer_actuel = GetTickCount();
    	long timer_depart = timer_actuel;
     
    	HANDLE hTimer = NULL;
    	LARGE_INTEGER temps_attente ;
    	temps_attente.QuadPart = -1000;
     
    	hTimer = CreateWaitableTimer(NULL, FALSE, "WaitableTimer");
    	if (NULL == hTimer) {
    		printf("CreateWaitableTimer failed (%d)\n", GetLastError());
    		return;
    	}
     
    	if (!SetWaitableTimer(hTimer, &temps_attente, 2, TimerProc, NULL, false)) {
    		printf("SetWaitableTimer failed (%d)\n", GetLastError());
    		return ;
    	}
     
    	while (!kbhit()){                         //Sinon, il sort tout seul...
    		SleepEx(INFINITE,TRUE);
    	}
    	printf("Coucou\n");
    	CloseHandle(hTimer);
    	return ;
    }
    Et voil� ce que j'obtient :
    Attente = 0
    Top d�part a 0 //D�j�, ca c'est bizarre, non ?
    Atteint � 23198593
    Atteint � 23198593
    Atteint � 23198609
    Atteint � 23198609
    Atteint � 23198609
    Atteint � 23198609
    Atteint � 23198609
    Atteint � 23198625
    Atteint � 23198625
    Atteint � 23198625
    Atteint � 23198625
    Atteint � 23198625
    Atteint � 23198640
    Atteint � 23198640
    Atteint � 23198640
    Atteint � 23198640
    Atteint � 23198640
    Atteint � 23198640
    Atteint � 23198656
    Atteint � 23198656
    Atteint � 23198656
    Atteint � 23198656
    Atteint � 23198656
    Ce que je ne comprend pas, c'est qu'il devrait normalement me donner des nombres espac�s (� peu pr�s) de 2 et pas par groupe de 6...

    Merci d'avance

  5. #5
    Membre chevronn� Avatar de stephdim
    Profil pro
    Inscrit en
    Ao�t 2007
    Messages
    462
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 462
    Par d�faut
    Bonjour,

    A mon avis �a va etre difficile d'avoir une meilleure pr�cision que 10 ms. (Le TimeSlice de Windows est r�gl� � 10 il me semble --> tranche de temps maxi accord� a un thread avant de commuter sur une autre tache)

    De plus meme a 10, la fiabilit� de l'appel .....

    Pour une grande pr�cision il faut s'orienter vers des systemes dits "temps-r�el". (il existe des systemes pour windows)

    Maintenant qu'est ce qui est genant a utiliser 100% de la CPU ? de toute fa�on une fois le Time Slice �coul� (10 ms), le thread perd la main pour un autre, et reprend la main longtemps apr�s ...

    Le WaitableTimer appelle cons�cutivement (dans la foul�e ) X fois la proc�dure pour rattraper le temps perdu.

    @+

  6. #6
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    oui ,la gamme nt est consid�r�e comme du temps r�el mou c'est � dire avec un temps de r�ponse de l'ordre de 10 ms ,et sans assurance que le d�lai born� soit respect�.
    windows ce embedded 6.0 se situe dans la gamme du temps r�el dur
    c'est � dire un temps r�ponse inf�rieur � 10 ms et avec l'assurance que le temps de rep�res born�s soit respect�.

  7. #7
    Membre chevronn� Avatar de stephdim
    Profil pro
    Inscrit en
    Ao�t 2007
    Messages
    462
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 462
    Par d�faut
    Il y a Windows CE ou RTX de Venturcom (non je ne fais pas de pub )
    pour windows nt/2000/xp

    @+

Discussions similaires

  1. Timer haute pr�cision
    Par chris069 dans le forum C++
    R�ponses: 3
    Dernier message: 29/04/2009, 15h53
  2. Sleep ou timer en millisecondes
    Par Joe Le Mort dans le forum Langage
    R�ponses: 2
    Dernier message: 08/11/2006, 15h45
  3. Sleep, Wait, Timer : que choisir ?
    Par Ender dans le forum G�n�ral VBA
    R�ponses: 2
    Dernier message: 25/07/2006, 13h02
  4. [C++ Builder 6] Timer de pr�cision pour chronom�tre
    Par doudoustephane dans le forum C++Builder
    R�ponses: 9
    Dernier message: 27/09/2005, 10h45
  5. Timer de pr�cision
    Par guigui dans le forum MFC
    R�ponses: 1
    Dernier message: 04/12/2002, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo