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 :

Timer/Compteur/où est le bug ?


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 Timer/Compteur/où est le bug ?
    En utilisant ce code trouvé sur le net (et modifié légèrement pour mon besoin perso) je me suis aperçu (sous Vista Familial) que parfois, de façon aléatoire, le compteur "passe tout droit" et au lieu de se remettre à zéro poursuit son décompte de minutes (TpsEcoul dans le Label1).

    Pour être clair : 2 compteurs affichés:
    - un qui se remet à zéro quand il a compté 60 secondes (label1)
    - un qui totalise les minutes (affiché dans label2)

    Quelqu'un a-t-il une idée de ce bug ?
    Je suis prêt à utiliser une autre méthode si besoin.

    MERCI BCP d'avance...


    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
    {Logiciel qui affiche un compte secondes et un totalisateur de minutes}
    unit Unit1;
    interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Timer1: TTimer;
        Label1: TLabel;
        Label2: TLabel;
        procedure FormCreate(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
    var
       Form1: TForm1;
       TheTime:Integer;
       TimeText :String;
       tpsecoul:String ;  // le temps écoulé en secondes
       nb_minutes: Integer;        // totalise les minutes
     
    implementation
     
    {$R *.DFM}
           // timer : interval réglé à 1000
    Function GetCounter(Second:Integer):String;
    Var
     Minute,NewSecond,Hour : Currency;
     
     Begin
      Hour       := Int(Second / 3600);
      Minute     := Int((Second-(Hour*3600))/60);
      NewSecond  := Second-int(Hour*3600+Minute*60);
      GetCounter := CurrToStr(Minute)+':'+CurrToStr(NewSecond);
    End;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     TheTime:=GetTickCount;
      nb_minutes:=1; //  c'est la minute N°1 au départ
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
     
     TpsEcoul:=GetCounter(GetTickCount Div 1000 -TheTime  Div 1000);
     If tpsEcoul='1:0' then   // mise à zéro du compteur à 1 minute
        Begin
        TheTime:=GetTickCount;
        Beep;
        inc(nb_minutes);  // incrémente les minutes
        End;
     
     Label1.Caption:=TpsEcoul;
     Label2.Caption:=IntToStr(nb_minutes); // affiche compteur minutes
    end;
     
    end.

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 909
    Points : 6 032
    Points
    6 032
    Par défaut
    C'est bien sûr cette comparaison qui est en cause:Au moment où le timer est activé, le temps de parcours de ton code fait que la condition n'est pas vérifiée. Il faudra trouver un autre moyen, d'autant que tester une chaine me parait peu orthodoxe quand on peut valablement tester du numérique.

    Il me semble que la FAQ montre un exemple de décompte du temps très précis...
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  3. #3
    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
    la FAQ donne cette piste :
    en utilisant la fonction IsValideTime().

    Je vais essayer ...

  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
    En fouinant j'ai écrit ça ...
    Peut-être pas très orthodoxe ...

    ça marche et j'appliquerai à ce que je veux faire (prog plus haut)
    Mais les commentaires ou corrections ou variantes seront bienvenues...

    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
    // chrono basique pour 10 secondes --- Avr 2008
    unit Unit1;
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Label1: TLabel;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure Delay(dwMilliseconds: Longint);
    var
      iStart, iStop: DWORD;
    begin
      iStart := GetTickCount;
      repeat
        iStop := GetTickCount;
        Form1.label1.caption :=IntTostr(istop div 1000-iStart div 1000);
        Application.ProcessMessages;
        Sleep(1); 
      until (iStop - iStart) >= dwMilliseconds;
     
     
      MessageDlg('Temps écoulé !.',mtCustom,mbOkCancel,0)
     
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
       delay(10000);
    end;
     
    end.

  5. #5
    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
    On va considérer comme "résolu" car effectivement c'était une erreur de tester sur un label.

    Par contre je vais relancer sur un sujet approchant car je n'ai pas tout compris !

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

Discussions similaires

  1. est ce que c'est un bug d'affichage ?
    Par aymenet1 dans le forum Débuter
    Réponses: 2
    Dernier message: 28/02/2010, 23h17
  2. ou est le bug ?
    Par alpha281189 dans le forum Débuter
    Réponses: 19
    Dernier message: 01/11/2009, 16h25
  3. Timer / compteur
    Par Dean59 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 19/05/2009, 18h10
  4. Grand jeu concours "Ou est mon bug? : Repere inversé"
    Par arnolpourri dans le forum DirectX
    Réponses: 10
    Dernier message: 03/04/2008, 10h45
  5. Solaris and le multithread -> où est le bug
    Par in dans le forum Langage
    Réponses: 4
    Dernier message: 07/02/2007, 09h26

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