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 actif
    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
    Points : 232
    Points
    232
    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
    Points : 17 323
    Points
    17 323
    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 actif
    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
    Points : 232
    Points
    232
    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 actif
    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
    Points : 232
    Points
    232
    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 confirmé 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
    Points : 521
    Points
    521
    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
    Points : 17 323
    Points
    17 323
    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 confirmé 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
    Points : 521
    Points
    521
    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