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

C++ Discussion :

Timer haute précision


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Points : 35
    Points
    35
    Par défaut Timer haute précision
    Bonjour,

    je souhaite creer un Timer qui aurait une precision de l'ordre de la microseconde.

    En parcourant le net, et differentes discussion sur forum, il me semble dur voir impossible de réaliser ca sous windows !

    On sait jamais peut etre que quelqu'un va avoir une idée.

    Pour l'instant j'ai un Timer qui aurait une précision d'a peu pres une dizaine de microseconde.

    Voici mon Timer :

    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
    34
    35
    36
    37
    38
    39
    40
     #include <windows.h>
     #include <iostream>
     using namespace std;
     
     int main(int argc, char *argv[], char *envp[])
     {  
         LARGE_INTEGER f, t1;
         double nbr_seconde = 0.000030;	//Timer de 30us
         double nbr_clk; 
         double freq;    
         double time_end;
     
     
    	 //Je récupere la fréquence du processeur
         QueryPerformanceFrequency( &f );
         freq = (double)f.QuadPart;
     
    	 //Calcul du nombre de tick en 30us (=durée que je voudrais mon Timer)
         nbr_clk = nbr_seconde * freq;
     
     
         //Timer qui commence
     
    			//Je recupere le nbre de tick d''horloge a l'instant t1 depuis la mise sous tension de l'ordi
                 QueryPerformanceCounter(&t1);
     
    			//Calcul du nbre de tick final = (nbre de tick en t1) + (nbre de tick en 30us)
                 time_end = (double)t1.QuadPart + nbr_clk;
     
                 while ( (double)t1.QuadPart < time_end )	//Je boucle tant que mon nbre de tick est inférieur au nbre de tick final
                 {
                       j++;
                       QueryPerformanceCounter(&t1); //je 
                 }  
         //Timer qui finit
     
         }
     
     return 0;
     }

    Si quelqu'un aurait une amélioration a apporter a mon code pour que mon timer soit plus précis, ou si il existe une autre solution pour faire un Timer plus precis ?

    Merci de votre aide

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Oui. Celle que t'avais suggérée r0d quand tu as posé la même question la semaine dernière
    Citation Envoyé par r0d
    bonjour,

    boost::thread permet ça, avec la fonction membre statique sleep et l'objet posix_time::nanosecond (une microseconde = 1000 nanosecondes).

    Une autre solution est possible (et à vrai dire, je ne connais pas les différences entre les deux), en utilisant la fonction non membre this_thread::sleep.

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Sinon, il est apparemment possible d'obtenir une précision à la nanoseconde avec l'API windows, il y a de nombreux articles à ce sujet =>

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Points : 35
    Points
    35
    Par défaut
    La solution qui passe par les libraire boost: posix ca ne marche pas c'est encore moins precis que celle utiliser avec l'API Windows c'est a dire les "QueryPerformanceCounter() et QueryPerformanceFrequency()".

    Une solution que j'ai trouver et qui marche plutot pas mal pour etre plus precis dans mon Timer, et d'augmenter la priorité de mon processus en passant par le gestionnaire des taches et de lui mettre temps reel, la j'obtiens une précision nettement meilleur.

    Ce que j'aurais voulu savoir, c'est si il est possible de mettre en temps reel mon petit prgm (*.exe) definitivement sans ne plus avoir a passer pas le gestionnaire des taches a chaque fois que je lance mon *.exe ??

Discussions similaires

  1. Timer et précision
    Par mikadev dans le forum VB.NET
    Réponses: 7
    Dernier message: 27/06/2014, 17h44
  2. Variables hautes précisions
    Par chemkacte dans le forum Algorithmes et structures de données
    Réponses: 39
    Dernier message: 30/09/2013, 11h03
  3. Sleep() et Timer grande précision
    Par jacklafrip dans le forum MFC
    Réponses: 6
    Dernier message: 13/08/2007, 12h29
  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