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++Builder Discussion :

[C++ Builder 6] Timer de pr�cision pour chronom�tre


Sujet :

C++Builder

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �prouv�
    Avatar de doudoustephane
    Homme Profil pro
    G�rant
    Inscrit en
    Ao�t 2005
    Messages
    1 129
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 40
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activit� : G�rant

    Informations forums :
    Inscription : Ao�t 2005
    Messages : 1 129
    Par d�faut [C++ Builder 6] Timer de pr�cision pour chronom�tre
    Bonjour.

    Je recherche un timer pour me faire un chronom�tre qui soit pr�cis au moins jusqu'au 100i�mes de secondes (voire 1000i�me si possible), quelle que soit la config du poste sur lequel l'appli final tourne.

    Connaissez-vous un composant qui est cela ?????

    J'en ai besoin d'URGENCE........

    Merci � tous 8) 8) 8)

  2. #2
    Membre Expert
    Avatar de Gilles Lou�se
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Par d�faut
    Le composant Ttimer de C++ Builder est � la milliseconde, 1000=1 seconde, il est tout � fait possible de faire une chronom�tre avec.

    � bient�t
    Gilles

  3. #3
    Membre �prouv�

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par d�faut
    Faux (je crois), le timer ne descend pas � la milliseconde.
    Je crois que le seuil minimal est de l'ordre de 50ms, m�me si le composant autorise une valeur inf�rieur il ne r�agira pas toutes les millisecondes mais toutes les 50ms.

    Pour faire un bon chronom�tre : utilise les compteurs de performance de Windows.
    Regarde du c�t� de GetTickCount ou cherche "compteur de performance" sous google.

  4. #4
    Membre chevronn�

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par d�faut
    Voici un exemple de chromon�tre que j'ai utilis� dans ma class CTracer:

    Le header:
    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
     
    class CTracer  {
     
      public:
        //----- Ctors & dtor -----
        CTracer();
       ~CTracer();
     
        //----- Misc -----
        double Pause();               //!< Pause the current chronometer
     
        //------ Output -----
        //! Display all the current information about all the sections
        friend ostream& operator<<(ostream&,const CTracer&);
     
      protected:
        //----- Protected data -----
        LARGE_INTEGER  start;      //!< The start time of the chronometer
        LARGE_INTEGER  subTotal;   //!< Subtotal time before the first current pause
        bool           HRPCAvail;  //!< Is there an available HRPC
     
        //----- Protected methods -----
        //! Start the chronometer
        void Start();
    };
    et l'impl�mentation (cpp):
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    //----------------------------------------------------------------------------
    //! Start the chronometer
    /*! Try to use the High Resolution Time Performance Counter. If it is not
        available, then use the low resolution GetTickCount function as a time
        counter.
     */
    void CTracer::Start() {
     
      HRPCAvail=QueryPerformanceCounter(&start);
      if (!HRPCAvail) {
        start.LowPart = ::GetTickCount();
        start.HighPart = 0;
      }
     
    }
     
    //! Pause the chronometer (allow nested pause: each pause must have its Continue)
    /*! Compute how many time elapsed since the last start/continue command and
        store it in the temporary subTotal variable.
        \return The elapsed time in milliseconds (is zero if already in pause)
     */
    double CTracer::Pause() {
     
      double result=0;
     
      if (pauses==0) {
        // Stop the chronometer and store the temporary total in subTotal
        if (HRPCAvail) {
          // Get the current time and add it the the sub-total
          LARGE_INTEGER stop; QueryPerformanceCounter(&stop);
          subTotal.QuadPart+=(stop.QuadPart - start.QuadPart);
          // Convert it in milliseconds
          LARGE_INTEGER FQPF; QueryPerformanceFrequency(&FQPF);
          result=static_cast<double>(stop.QuadPart - start.QuadPart) * 1000
                /static_cast<double>(FQPF.QuadPart);
        } else {
          // Get the current time and convert it in a large integer
          DWORD stop = ::GetTickCount();
          LARGE_INTEGER total;
          total.HighPart=0; total.LowPart=stop-start.LowPart;
          // Add it to the sub-total
          subTotal.QuadPart+=stop;
          // Convert to result
          result=(double)stop;
        }
      }
     
      // Count the number of pauses
      ++pauses;
     
      // Return the number of milliseconds
      return result;
     
    }
    A �purer et retravailler un peu... Je ne t'ai pas mis le code pour reprendre apr�s une pause ou arr�ter d�finitivement le chronom�tre. Si tu en as besoin, n'h�sites � pas � me le demander; j'ai donn� ce code pour la page des sources mais il n'est pas encore disponible.

  5. #5
    Membre chevronn�


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 855
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 855
    Par d�faut
    Citation Envoy� par Patrick Seuret
    j'ai donn� ce code pour la page des sources mais il n'est pas encore disponible.
    Ce n'est plus qu'une question de jours !

    Edit -> le voici : http://c.developpez.com/sources/bcb/...rairie#ctracer

  6. #6
    Membre �prouv�
    Avatar de doudoustephane
    Homme Profil pro
    G�rant
    Inscrit en
    Ao�t 2005
    Messages
    1 129
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 40
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activit� : G�rant

    Informations forums :
    Inscription : Ao�t 2005
    Messages : 1 129
    Par d�faut
    Merci � tous. Je vois �a et je vous tiens au courant.

    Par contre, Patrick, oui j'ai besoin de faire des pauses et arr�t d�finitf.
    peux-tu me donner le code pour cela??

  7. #7
    Membre chevronn�

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par d�faut
    Il te suffit de rajouter ces deux fonctions (et le destructeur que j'avais oubli�):

    Dans le header:
    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
     
         CTracer();
       ~CTracer();
     
        //----- Misc -----
        void Start();                //!< Start the chronometer
        double Pause();               //!< Pause the current chronometer
        void   Continue();            //!< Restart the current chronometer
        void   Stop();                //!< Stop the chronometer
     
        //------ Output -----
        //! Display all the current information about all the sections
        friend ostream& operator<<(ostream&,const CTracer&);
     
      protected:
        //----- Protected data -----
        unsigned int   pauses;     //!< How many pauses are currently called
        LARGE_INTEGER  start;      //!< The start time of the chronometer
        LARGE_INTEGER  subTotal;   //!< Subtotal time before the first current pause
        bool           HRPCAvail;  //!< Is there an available HRPC
    Impl�mentation:
    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
    41
     
    //----------------------------------------------------------------------------
    //! Continue after a pause (restart only when all pauses are continued)
    void CTracer::Continue() {
     
      // Not in pause
      if (pauses==0) return;
     
      // Restart the chronometer if it was the last pause
      if ((--pauses)==0) Start();
     
    }
     
    //----------------------------------------------------------------------------
    //! Stop the chronometer and store the result in the section
    void CTracer::Stop() {
     
      // Stop the chrono whatever its state
      Pause();
     
      // Add the current subtotal of time to the section entry
      section->totalTime.QuadPart+=subTotal.QuadPart; subTotal.QuadPart=0;
      section->count++;
     
      // Reset subTotal
      subTotal.QuadPart=0;
     
    }
     
    //----------------------------------------------------------------------------
    //! The tracer is deleted. Stop the chronometer and unregister from the tree
    /*! In the RAII pattern design, some very important tasks are done in the
        destructor. Here we stop the chronometer and store the counted time in the
        tree.
     */
    CTracer::~CTracer() {
     
      // Stop the chronometer
      Stop();
     
    }
    Tu n'as pas besoin de la variable "count" car dans mon code, elle sert � compter combien de fois chaque chronom�tre a �t� appel�...

  8. #8
    Membre Expert
    Avatar de Gilles Lou�se
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Par d�faut
    Citation Envoy� par Neilos
    Faux (je crois), le timer ne descend pas � la milliseconde.
    Je crois que le seuil minimal est de l'ordre de 50ms, m�me si le composant autorise une valeur inf�rieur il ne r�agira pas toutes les millisecondes mais toutes les 50ms.
    Vous avez raison, j'ai fait un petit test, le TTimer ne r�agit pas toutes les millisecondes (ce nombre a sans doute �t� �t� choisi pour pouvoir r�gler � la milliseconde pr�s l'appel du timer � partir du moment o� effectivement l'intervalle est assez grand.)

    Je d�clare deux variables dans la classe principale.

    N sera le nombre de fois o� le timer est appel� (r�gl� � 1) et DepSec est le num�ro de seconde de l'heure courante au d�part.

    J'initialise ces variables dans le constructeur.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    __fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
    {
    N=0;
    TDateTime D=Now();
    DepSec= StrToInt(FormatDateTime("s",D));
    }
    On met un timer et deux TEdit sur la forme, le premier affichera le nombre de fois que le timer a �t� appel� et le second le nombre de secondes depuis le d�but de l'ex�cution. L'�v�nement OnTimer affiche ces donn�es.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    int NbSec;
    TDateTime D=Now();
     
    NbSec= StrToInt(FormatDateTime("s",D))-DepSec;
    if(NbSec<0) NbSec+=60;
    Edit1->Text=(IntToStr(N++));
    Edit2->Text=(NbSec);
    if(NbSec==10) Timer1->Enabled=false;
    }
    On ar�te le timer au bout de 10 secondes. On voit qu'il n'est appel� que 600 fois environ soit une fois toute les 16 millisecondes mais il se peut que �a d�pende aussi de la performance de la machine.

    � bient�t
    Gilles

  9. #9
    Nouveau candidat au Club
    Inscrit en
    Mai 2003
    Messages
    2
    D�tails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 2
    Par d�faut
    la resolution de TOUTS les timer de Windows sont bas� sur l'horloge syt�me qui controle le signal d'interruption NMI.
    On ne peut pas en sortir directement par soft.
    Sur les syt�me equip� du �P � une frequence ~2 Ghz la frequence de ce signal est d'environ 10 ms pour les frequence superieure la fresquence est 1/64 sec.
    En consquence touts les evenements ne peuvent se produire que toutes x*10ms ou x*1/64ms.

    Pour connaitre la resolution actuelle du syst�me d'horloge :

    GetSystemTimeAdjustment(

    &lpTimeAdjustment, // size, in 100-nanosecond units, of a periodic time adjustment
    &lpTimeIncrement, // time, in 100-nanosecond units, between periodic time adjustments
    &lpTimeAdjustmentDisabled // whether periodic time adjustment is disabled or enabled
    );

    lpTimeAdjustment /10 = frequence timer.

    Pour modifier cette resolution , 2 solutions:
    1/ modifier le signal NMI et mettre � jour le syt�me ( c'est prevus en mode Ma�tre).
    2/ Autre solution plus abordable generer un signal que l'on applique sur le port serie et se synchroniser dessus.

    Pour plus d'info voir :
    http://www.developpez.net/forums/viewtopic.php?t=399929

  10. #10
    Membre �prouv�
    Avatar de doudoustephane
    Homme Profil pro
    G�rant
    Inscrit en
    Ao�t 2005
    Messages
    1 129
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 40
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activit� : G�rant

    Informations forums :
    Inscription : Ao�t 2005
    Messages : 1 129
    Par d�faut
    Merci � tous.

    Malgr� le temps syst�me de 10ms chez moi, les timers que vous m'avez donn� fonctionne comme je le souhaite.

    merci encore � vous tous pour aide 8)

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Besoin d'une pr�cision pour try/catch, svp
    Par hallek60 dans le forum C++
    R�ponses: 9
    Dernier message: 05/01/2006, 21h15
  2. [timer] Compte � rebours pour redirection !
    Par Raideman dans le forum G�n�ral JavaScript
    R�ponses: 2
    Dernier message: 31/12/2005, 20h07
  3. [VB.NET]Besoin de pr�cision pour architecture 3-tiers
    Par Dnx dans le forum Windows Forms
    R�ponses: 8
    Dernier message: 14/09/2005, 09h09
  4. R�ponses: 19
    Dernier message: 15/03/2005, 09h05
  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