Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Problem mit GetTickCount für Stoppuhr (https://www.delphipraxis.net/168915-problem-mit-gettickcount-fuer-stoppuhr.html)

Accipiper 18. Jun 2012 11:53

Problem mit GetTickCount für Stoppuhr
 
Hallo an alle, kurz vor ab, ich bin noch Anfänger und es kann sein, dass daher manches vielleicht auch etwas banal wirkt, ich bitte euch dass dann zu entschuldigen.

So zu meinem Problem. Ich will eine Stoppuhr programmieren, bei der zwei Zeiten für zwei Teams laufen, die dann unterschiedlich aufhören. Soweit so gut. Ich habe die Funktion GetTickCount verwendet, da mir der Timer zu ungenau war.
Tausendstelsekunden sollte als Genauigkeit ja eigentlich kein Problem darstellen.

Die Sache ist, dass bei mir die Tausendstelstellen nur mit 0, 1, oder 2 beginnen. Und wenn ich bei A bei 00:00:01:162 stoppe, und dann bei B auf stopp drücke steht da: 00:00:01:056. Dass kann ja eigentlich nicht sein, wisst ihr woran es liegen könnte?

Code:
var
  Form1: TForm1;
  a , b , c , tickerA , tickerB : longint;
  h , m , s , ts : byte;
  t : string;

implementation

{$R *.dfm}

procedure TForm1.btn_startClick(Sender: TObject);
begin
   a:=gettickcount();
   timerA.Enabled := true;
   timerB.Enabled := true;
end;

procedure TForm1.timerATimer(Sender: TObject);
begin
   tickerA := tickerA + 1;
   b := gettickcount();
   ts := (b-a) mod 1000;
   s := ((b-a) div 1000) mod 60;
   m := ((b-a) div 60000) mod 60;
   h := ((b-a) div 3600000) mod 24;
   t := Format('%2.2d:%2.2d:%2.2d:%2.3d', [h, m, s, ts]);
   lbl_timeA.caption:=t;
end;

procedure TForm1.timerBTimer(Sender: TObject);
begin
   tickerB := tickerB + 1;
   c := gettickcount();
   ts := (c-a) mod 1000;
   s := ((c-a) div 1000) mod 60;
   m := ((c-a) div 60000) mod 60;
   h := ((c-a) div 3600000) mod 24;
   t := Format('%2.2d:%2.2d:%2.2d:%2.3d', [h, m, s, ts]);
   lbl_timeB.caption:=t;
end;

procedure TForm1.btn_stopAClick(Sender: TObject);
begin
   timerA.Enabled := false;
end;

procedure TForm1.btn_stopBClick(Sender: TObject);
begin
    timerB.Enabled := false;
end;

procedure TForm1.btn_resetClick(Sender: TObject);
begin
   lbl_timeA.Caption := 'Zeit Team A';
   lbl_timeB.Caption := 'Zeit Team B';
end;

procedure TForm1.btn_continueAClick(Sender: TObject);
begin
    timerA.Enabled := true;
end;

procedure TForm1.btn_continueBClick(Sender: TObject);
begin
     timerB.Enabled := true;
end;

end.
Den Timer hab ich nur zur Aktualisierung des Labels einsetzen wollen, da mir das am einfachsten erschien, und die Uhr ja laufen soll (soll halt sichtbar sein).


Ich freue mich schon auf eure Hilfe, bin nämlich gerade ein bisschen verzweifelt. Danke schon mal im Voraus.

Jumpy 18. Jun 2012 12:08

AW: Problem mit GetTickCount für Stoppuhr
 
Ich würd nur einen Timer machen, der parallel beiden Displays den selben Wert gibt. Die Uhren laufen ja parallel.
Es sollte zwei Booleans geben ala A_Active und B_Active, die beim Start beide auf true gesetzt werden. Beim Timerevent:
Ist A_Active, dann Display aktualisieren, ist B_Active dann Display aktualisieren.
Wird ein Stop Button gedrückt(z.B. A), dann A_Active auf False setzen und einmal an dieser Stelle das Display aktualisieren, damit das Display auf der Zeit stehen bleibt, an der tatsächlich Stop gedrückt wurde und nicht das vom letzten TimerEvent, das ja schon X Milisekunden her sein kann.

Wird B gedrückt analog.

Es müsste auch bei A oder B gedrückt geschaut werden, ob das jeweils andere noch aktiv ist. Falls nicht Timer beenden.

DeddyH 18. Jun 2012 12:13

AW: Problem mit GetTickCount für Stoppuhr
 
TTimer ist zu ungenau, daher GetTickCount, das aber wieder über einen Timer aufgerufen? Die Logik verstehe ich nicht.

EWeiss 18. Jun 2012 12:21

AW: Problem mit GetTickCount für Stoppuhr
 
Zitat:

Zitat von DeddyH (Beitrag 1171381)
TTimer ist zu ungenau, daher GetTickCount, das aber wieder über einen Timer aufgerufen? Die Logik verstehe ich nicht.

Jo..

Delphi-Quellcode:
Application.OnIdle := IdleLoop;
procedure IdleLoop(Sender : TObject; Var Done: Boolean);
Wäre eine alternative für den Timer in zusammenhang mit GetTickCount

gruss

Jumpy 18. Jun 2012 13:13

AW: Problem mit GetTickCount für Stoppuhr
 
Ich hatte das so verstanden, das der Timer in bestimmten Abständen die Zeitdisplays aktualisieren soll, die tatsächliche Zeit zu diesen Zeitpunkten soll aber per TickCount ermittelt werden.

DeddyH 18. Jun 2012 13:30

AW: Problem mit GetTickCount für Stoppuhr
 
OK, aber wieso? TDateTime enthält auch Millisekunden, man könnte also die Differenzen mit den DateUtils-Funktionen errechnen und ausgeben, dazu braucht es kein GetTickCount.

Accipiper 18. Jun 2012 13:31

AW: Problem mit GetTickCount für Stoppuhr
 
Genau, der Timer soll nur für die Aktualisierung sorgen. Ich verstehe nur nicht, wie ich zu den Zeiten kommen. Habe ich was falsch dividiert?
GetTickCount gibt mir ja eigentlich Tausendstelsekunden aus, von daher sollte es theoretisch passen.

Das Problem ist, dass für die Hunderterstelle der Millisekunden immer nur 0, 1 oder 2 stehen. Das kann ja eigentlich nicht sein.

DeddyH 18. Jun 2012 13:34

AW: Problem mit GetTickCount für Stoppuhr
 
ts ist vom Typ byte, kann also niemals größer als 255 werden.

Accipiper 18. Jun 2012 13:36

AW: Problem mit GetTickCount für Stoppuhr
 
Super, das wars danke dir, habs als Integer definiert, jetzt funzt es! :)

Vielen Dank euch.

Uwe Raabe 18. Jun 2012 13:59

AW: Problem mit GetTickCount für Stoppuhr
 
Bevor du auf das nächste Problem stößt:

Zitat:

The resolution of the GetTickCount function is limited to the resolution of the system timer, which is typically in the range of 10 milliseconds to 16 milliseconds.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz