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:
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).
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. Ich freue mich schon auf eure Hilfe, bin nämlich gerade ein bisschen verzweifelt. Danke schon mal im Voraus. |
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. |
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.
|
AW: Problem mit GetTickCount für Stoppuhr
Zitat:
Delphi-Quellcode:
Wäre eine alternative für den Timer in zusammenhang mit GetTickCount
Application.OnIdle := IdleLoop;
procedure IdleLoop(Sender : TObject; Var Done: Boolean); gruss |
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.
|
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.
|
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. |
AW: Problem mit GetTickCount für Stoppuhr
ts ist vom Typ byte, kann also niemals größer als 255 werden.
|
AW: Problem mit GetTickCount für Stoppuhr
Super, das wars danke dir, habs als Integer definiert, jetzt funzt es! :)
Vielen Dank euch. |
AW: Problem mit GetTickCount für Stoppuhr
Bevor du auf das nächste Problem stößt:
Zitat:
|
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