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 :

Gestion du temps [IDE]


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 80
    Par défaut Gestion du temps
    Bonjour,

    J'aurai voulu savoir tout d'abord si la propriété Interval du composant TTimer est limité en millisecondes ( si oui qu'elle est sa valeur maximale ?).

    Actuellement, je développe une application qui au bout d'un temps donné par l'utilisateur effectuera une tâche. Deux méthodes me viennent à l'esprit pour pouvoir gérer le temps soit :

    - J'utilise le composant TTimer et je renseigne sa propriété Interval par le temps donné par l'utilisateur ( bien sur converti en millisecondes ).

    - Je compare le temps de départ avec le temps final, ce qui donnerait :

    SAISIR tempsutilisateur
    // L'utilisateur démarre la procédure en cliquant sur un bouton
    tempsdebut = time()
    tempsfin = time()+ tempsutilisateur

    TANTQUE tempsdebut != tempsfin FAIRE
    Timer1->interval = 1000; // + 1 sec à chaque passage
    Timer1->enabled = true;

    ONTimer :
    Timer1->enabled= false;

    FINTANTQUE


    Qu'elle méthode semble la plus correcte selon vous, sachant que le temps donné par l'utilisateur peut-être en heures, en minutes ou encore en secondes?

    Le composant TTimer suffit-il à lui seul à résoudre mon problème ou alors doit-je boucler en comparant les deux temps à chaque secondes passées... ?

    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Il faut savoir que la précision du Timer est très faible et peu fiable, et il ne dois pas être utilisé pour gérer du temps de façon précise.
    D'autant plus sur des longues périodes (1h) où l'imprécision peut être d'autant plus grande.

    Si par contre tu n'a pas besoin de précision, l'utilisation du Timer peut en effet être envisagé.
    Mais je te conseille l'utilisation d'un compteur, plutôt qu'une boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int cpt, attente ;
    //[...]
    Le code du Timer (Interval régler à 1000 pour 1s et Enabled initialisé à false:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
      cpt++;
      if( cpt >= attente )
      {
        Timer1->Enabled = false ;
        //Traitement est la fonction a appeler à la fin de l'attente
        Traitement() ; 
      }
    }
    et un bouton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
     cpt = 0 ;
     attente = 900 ; //900s = 15min
     Timer1->Enabled = true ;
    }
    A noter que ce code peut facilement être modifié pour obtenir une très bonne précision en utilisant GetTickCount pour gérer le temps (et le Timer n'est alors utilisé que pour vérifier périodiquement si le temps est terminé)!

  3. #3
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    La même chose avec GetTickCount.
    Tu aura donc une précision de l'ordre de la seconde (si ton Timer->Interval est régler à 1000):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int attente ;
    //[...]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
      if( GetTickCount() >= attente )
      {
        Timer1->Enabled = false ;
        //Traitement est la fonction à appeler à la fin de l'attente
        ShowMessage( "TERMINÉ" ); 
      }
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
     attente = GetTickCount() + (900*1000); ; //900000ms = 900s = 15min
     Timer1->Enabled = true ;
    }

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 80
    Par défaut
    Merci pour tes réponses, toujours aussi disponible et rapide !

    J'essayerai cette après-midi ta solution.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 80
    Par défaut
    Mon programme marche parfaitement merci à toi !

    Dernière question pourquoi le Timer est-il si peut précis et peut fiable ?

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    Par défaut
    Salut !

    Parce que c'est un timer système (messagerie interne) et non hardware (interruption matérielle).

    En fait, si on dispose de l'interface MIDI, il est possible de séquencer à 60 BPM (noires par minute) avec une excellente stabilité.
    Et dans ce cas, au lieu de faire "cacapoum" et bien on peut exécuter des tâches !
    Ici, il faudrait savoir si la précision (coupé au couteau) est ou n'est pas requise !

    Du point de vue timing (par secondes), un ATARI (donc d'il y a 20 ans) aurait été plus précis !!!
    Mais bon ... on y peut rien et on se satisfait, à moindre coût, avec de l'approximation !

    A plus !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. FB/IB gestion du temps
    Par lio33 dans le forum Débuter
    Réponses: 4
    Dernier message: 04/10/2005, 10h55
  2. [MFC] Gestion du temps
    Par Kevgeii dans le forum MFC
    Réponses: 7
    Dernier message: 02/07/2005, 14h21
  3. Aide pour l'analyse d'un problème de gestion de temps
    Par PAINCO dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 03/06/2005, 15h49
  4. [VB.NET] Gestion en temps réel d'une bdd access
    Par qwiskas dans le forum Windows Forms
    Réponses: 6
    Dernier message: 12/02/2005, 19h37
  5. fonction de gestion du temps
    Par fati dans le forum C
    Réponses: 5
    Dernier message: 26/12/2002, 16h32

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