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

Langage Delphi Discussion :

Gestion du temps (Timer -chrono + événements)


Sujet :

Langage Delphi

  1. #1
    Inactif  
    Inscrit en
    Février 2004
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 97
    Points : 53
    Points
    53
    Par défaut Gestion du temps (Timer -chrono + événements)
    Je voudrais créer un compteur de temps (compte -minute) qui puisse déclencher des événements à des instants précis (par ex. toutes les 56 secondes)
    Attention : ce que je demande ce n'est pas un simple chrono (on en trouve facilement sur le Net)

    - je bute sur 2 problèmes :
    1) fabrication du compteur (sans passer par GetTickCount). Dans le code que je donne la variable qui incrémente mes minutes affiche 64 à la minute 1, 128 à la deux etc !!)
    2) lancement (appui sur Button) qui commence à la seconde ZERO. Ici ça commence en se fixant sur l'horloge système, donc n'importe quand .

    Merci de vos bouts de codes .
    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
    56
    57
    58
    // chrono
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Timer1: TTimer;
        Label1: TLabel;
        Button1: TButton;
     
        procedure Timer1Timer(Sender: TObject);
        procedure FormActivate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
      Present: TDateTime;
      Hour, Min, Sec, MSec, Cpte_Min: Word;
     
    implementation
     
    {$R *.DFM}
     
     // Interval Timer réglé à 10
     
     
    procedure TForm1.FormActivate(Sender: TObject);
    begin
    Cpte_Min:=0;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    Timer1.Enabled:=True;
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
     
                  Present:=Now;
                  DecodeTime(Present, Hour, Min, Sec, MSec);
                  if sec=59 then Cpte_Min:=Cpte_Min+1;
                  Label1.Caption:=IntToStr(sec)+'  Min :'+IntToStr(Cpte_Min);
     
    end;
    end.

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 879
    Points : 11 378
    Points
    11 378
    Billets dans le blog
    6
    Par défaut
    quel est l'intervalle de ton timer ?

    chaque fois qu'il se déclenchera et que l'horloge système sera à 59 secondes, il ajoutera une minute à ton compteur...

  3. #3
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
     
                  Present:=Now;
                  DecodeTime(Present, Hour, Min, Sec, MSec);
                  if sec=59 then Cpte_Min:=Cpte_Min+1;
                  Label1.Caption:=IntToStr(sec)+'  Min :'+IntToStr(Cpte_Min);
     
    end;
    ????
    comme ta dit tourlourou:
    quel est l'intervalle de ton timer ?
    en plus pourquoi cassé la tete avec sa, l'horloge system ne te sufit pas??
    car la tu fait la même chose ,non...???
    que veux tu faire exactement...???

  4. #4
    Inactif  
    Inscrit en
    Février 2004
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 97
    Points : 53
    Points
    53
    Par défaut
    Merci pour ces débuts de réponse mais, Edam et Tourlourou vous avez mal lu mon code : l'interval/Timer est indiqué en commentaire juste après implementation.
    Là il était fixé à 10 mais avec d'autres valeurs le pb était le m^me.

    Pas grave.

    J'explique un peu plus ce que je veux faire :
    - 1) idée globale : faire un compte seconde et compte minute bien visibles (ça, comme je l'ai écrit : ça existe on en trouve sur le Web) MAIS :avec deux alertes sonores : passage à la minute et si nécessaire, à la 56ème seconde, annoncer un changement de force sur un programme d'entraînement vélo (cardiologie) (C'est un programme avec des paliers et des pointes donc c'est variable d'où un test nécessaire)

    - 2) Réalisation : j'ai essayé avec GetTickCount et je me suis planté 2 fois : dans un autre post on m'avait dit que je faisais un test sur un string (la 56 eme seconde indiquée dans un Label). J'ai donc corrigé et fait le test sur une valeur (integer) : ce qui n'a pas changé le pb car de façon IMPREVISIBLE le compteur "passait tout droit" à la 59 eme sec. et continuait 60, 61, 62 etc...
    au lieu de revenir à 0.
    Donc maintenant, j'en suis à chercher une autre méthode et je me heurte toujours au pb de l'appel à l'événement 56 eme seconde. (Lire une petite commande sonore -Wav- SANS que cela ait des repercussions non souhaitées sur le déroulement du chrono.

    Je suis un peu long mais ... ce petit programme où je note mes pulsations toutes les minutes me tient ... à coeur !!

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 879
    Points : 11 378
    Points
    11 378
    Billets dans le blog
    6
    Par défaut
    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
    procedure TForm1.Button8Click(Sender: TObject);
    var
      Present: TDateTime;
      Hour, Min, Sec, MSec, Cpte_Min: Word;
    begin
      if Timer1.Enabled
      then Timer1.Enabled:=False
      else begin
        Present:=Now;
        DecodeTime(Present, Hour, Min, Sec, MSec);
        Timer1.Tag:=Sec+60*(Min+60*Hour); // sert à stocker l'heure de départ
        Timer1.Interval:=10;
        Timer1.Enabled:=True;
      end;
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
     Present: TDateTime;
     Hour, Min, Sec, MSec, Cpte_Min: Word;
     Elapsed: integer;
    begin
      Enabled:=False;
      // temps écoulé
      Present:=Now;
      DecodeTime(Present, Hour, Min, Sec, MSec);
      Elapsed:=Sec+60*(Min+60*Hour)-Timer1.Tag;
      // pour déclencher toutes les x secondes
      if Elapsed mod 15 = 0 then Beep;
      // calculs
      Sec:=Elapsed mod 60;
      Min:=Elapsed div 60;
      // pour déclencher à la x iéme seconde
      if Sec=56 then Beep;
      // pour affichage
      Edit1.Text:=IntToStr(Min)+' : '+IntToStr(Sec);
      Enabled:=True;
    end;
    [EDIT] le pb de ce code, c'est que les Beeps seront déclenchés plusieurs fois dans la seconde où c'est vérifié : mais c'est la trame pour un compo descendant de TTimer, avec des champs à tester pour savoir si à un temps donné, l'alarme doit être déclenchée

  6. #6
    Inactif  
    Inscrit en
    Février 2004
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 97
    Points : 53
    Points
    53
    Par défaut
    merci Tourlourou c'est ce que je cherchais à faire.

    Le pb du beep à répétition ne me gêne pas : j'ai testé avec mon message wav (avec mediaplayer) et ça passe correctement.

    1) Si ce beep faisait pb faudrait-il traiter ça avec un thread ??
    (là je m'embarque dans qqchose que je ne maîtrise absolument pas vu mon niveau !!)

    2) Autre chose, dans ton code je n'arrive pas à initaliser le chrono à zéro min et zéro sec.

  7. #7
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    voir ce composant

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 879
    Points : 11 378
    Points
    11 378
    Billets dans le blog
    6
    Par défaut
    je n'arrive pas à initaliser le chrono à zéro min et zéro sec
    euh, ça se fait tout seul, non ?

  9. #9
    Inactif  
    Inscrit en
    Février 2004
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 97
    Points : 53
    Points
    53
    Par défaut
    Tourlourou : OK, j'ai vu mon erreur !
    J'avais mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sec:=Elapsed mod 60 et min := Elapsed div 60
    en commentaires...

    Donc ton code me satisfait pleinement !
    Merci beaucoup ... depuis le temps que je sèchais !!

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

Discussions similaires

  1. Gestion d'un timer en dehors d'une fenêtre
    Par eag35 dans le forum MFC
    Réponses: 3
    Dernier message: 04/07/2005, 14h25
  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