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 :

Chronomètre avec fonction Pause/Reprise


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut Chronomètre avec fonction Pause/Reprise
    Bonjour à tous,
    Je dois créer un chronomètre avec Delphi. Là, il n'y a pas de souci, j'ai utiliser un avec un Timer réglé à 1000 comme intervalle.
    Maintenant, je dois implémenter la fonction Pause et Reprise, la je bloque un peu.
    Si quelqu'un peut m'orienter vers une piste.
    Merci
    Andry

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    un Timer c'est bien pour montrer l'affichage du chronomètre mais rien de plus, selon la vitesse d'affichage, on baisse l'interval mais en aucun cas on se sert de cela comme mesure, cela sera totalement faux


    c'est un TStopwatch qu'il faut utiliser pour mesurer le temps, cela gère Stop, Pause et Reprise

    Sinon plus simple, tout simple Now() et une soustraction, suffit de comparer deux dates, plus si l'on veut gérer des intervalles.
    Si l'on ne stocke pas les intervalles, suffit de faire la soustraction Tend - Tbegin lors de la pause, et à la reprise Tbegin prend un nouveau temps, à chaque fois pause\reprise, il faut juste accumuler le delta

    Ton Chronomètre et son affichage via message\timer\paintbox ... doivent être disjoint !
    Ne mélange pas la fréquence d'affichage et le temps réel mesuré.

  3. #3
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Bonjour.
    Citation Envoyé par ShaiLeTroll Voir le message
    un Timer c'est bien pour montrer l'affichage du chronomètre mais rien de plus, selon la vitesse d'affichage, on baisse l'interval mais en aucun cas on se sert de cela comme mesure, cela sera totalement faux
    c'est un TStopwatch qu'il faut utiliser pour mesurer le temps, cela gère Stop, Pause et Reprise
    Bien sur que j'utilise TStopWatch pour calculer comme suit dans un OnTimer event.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    FEllapsedTime := FStopWatch.ElapsedMilliseconds/MSecsPerDay;
    LabelChrono.caption := FormatDateTime('nn:ss', FEllapsedTime );
    C'est plus le pause/resume qui me fait défaut. Je vais approfondir de ce coté

    Merci

  4. #4
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 776
    Points
    2 776
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Andry Voir le message
    Bonjour à tous,
    Je dois créer un chronomètre avec Delphi. Là, il n'y a pas de souci, j'ai utiliser un avec un Timer réglé à 1000 comme intervalle.
    Maintenant, je dois implémenter la fonction Pause et Reprise, la je bloque un peu.
    Si quelqu'un peut m'orienter vers une piste.
    Merci
    Andry
    Timer.disable=PAUSE
    Timer.enable=Restart
    Pour le code j'utilisais ce genre de chose pour un compteur de temps en seconde
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        DT_HeureDebut, DT_HeureFin : TDateTime ;
    	L_DureeSec := Round((DT_HeureFin-DT_HeureDebut)*86400-0.49) ;
    Si besoin je peux te donner le code
    86400 * 24*60*60

  5. #5
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Bonjour à tous,
    Merci pour vos conseils, avec le TStopWatch, tout etait déjà la en faite.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      FEllapsed := FDuration.Subtract(FStopWatch.Elapsed);
      LabelChrono.Text := Format('%2.2d:%2.2d', [FEllapsed.Minutes,
                                                 FEllapsed.Seconds]);
      if FEllapsed.TotalSeconds < 0 then
        TimerSW.Enabled := False;
    Avec
    FDuration la durée du Chrono de type TTimeSpan
    FEllapsed le temps restant type TTimeSpan

    Il ne reste plus qu'à savoir comment assigner les heurs, minutes et secondes dans FDuration
    Merci

  6. #6
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 776
    Points
    2 776
    Billets dans le blog
    10
    Par défaut Un exemple chronomètre
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    unit Chrono1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
      System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Diagnostics, Vcl.ExtCtrls,
      Vcl.StdCtrls;
     
    type
      TForm1 = class(TForm)
        BtStart: TButton;
        BtPause: TButton;
        BtStop: TButton;
        Timer1: TTimer;
        Label1: TLabel;
        BtRestart: TButton;
        procedure BtStartClick(Sender: TObject);
        procedure BtStopClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure BtRestartClick(Sender: TObject);
        procedure BtPauseClick(Sender: TObject);
      private
        FStartTime: TDateTime;
        FStopTime: TDateTime;
        FRunning: Boolean;
        FPause: Boolean;
      end;
     
    var
      Form1: TForm1;
     
    var
      DDebut, DCumul: TDateTime;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.BtPauseClick(Sender: TObject);
    begin
      if FRunning then
        FPause := true;
    end;
     
    procedure TForm1.BtRestartClick(Sender: TObject);
    begin
      if FRunning then
      begin
        FPause := false;
        FStartTime := now - (FStopTime - FStartTime)  ;
      end;
    end;
     
    procedure TForm1.BtStartClick(Sender: TObject);
    begin
      if not FRunning then
      begin
        FStartTime := Now;
        FRunning := true;
        FPause := false;
      end;
    end;
     
    procedure TForm1.BtStopClick(Sender: TObject);
    begin
      if FRunning then
      begin
        FStopTime := Now;
        FRunning := false;
      end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      FRunning := false;
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      if FPause then
        exit ;
      if FRunning then
        FStopTime := Now;
      Label1.Caption := Format('%s', [FormatDateTime('hh:nn:ss.zzz',
        FStopTime - FStartTime)])
    end;
     
    end.
    Bonne journée
    Note : pour afficher le résultat en secondes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Label2.Caption := round((FStopTime - FStartTime) * 86400).ToString

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Regarde FormatElapsedTime pour convertir des micro-secondes en un affichage humain
    je te laisse modifier pour gérer des millisecondes


    le code ALWEBER doit gérer une seule pause, donc faut stocker le delta à chaque pause.

  8. #8
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 776
    Points
    2 776
    Billets dans le blog
    10
    Par défaut Pb Restart
    Citation Envoyé par ShaiLeTroll Voir le message
    ...
    le code ALWEBER doit gérer une seule pause, donc faut stocker le delta à chaque pause.
    Je viens de tester....

    j'ai mis les sources pour vous permettre de tester
    ça à l'air de marcher
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. problèmes avec la fonction \pause
    Par nassau92 dans le forum Beamer
    Réponses: 0
    Dernier message: 26/07/2017, 22h10
  2. Réponses: 3
    Dernier message: 16/06/2004, 11h26
  3. [langage] problème avec fonction read
    Par domidum54 dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2004, 20h42
  4. [VStudio 6] pb avec fonctions dans une DLL
    Par MogDeChNord dans le forum MFC
    Réponses: 8
    Dernier message: 08/01/2004, 08h57
  5. Comment chronométrer une fonction
    Par 323 dans le forum Pascal
    Réponses: 3
    Dernier message: 19/03/2003, 20h24

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