AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE Problem mit GetTickCount für Stoppuhr

Problem mit GetTickCount für Stoppuhr

Ein Thema von Accipiper · begonnen am 18. Jun 2012 · letzter Beitrag vom 18. Jun 2012
Antwort Antwort
Accipiper

Registriert seit: 18. Jun 2012
5 Beiträge
 
#1

Problem mit GetTickCount für Stoppuhr

  Alt 18. Jun 2012, 11:53
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.
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#2

AW: Problem mit GetTickCount für Stoppuhr

  Alt 18. Jun 2012, 12:08
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.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Problem mit GetTickCount für Stoppuhr

  Alt 18. Jun 2012, 12:13
TTimer ist zu ungenau, daher GetTickCount, das aber wieder über einen Timer aufgerufen? Die Logik verstehe ich nicht.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Problem mit GetTickCount für Stoppuhr

  Alt 18. Jun 2012, 12:21
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
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#5

AW: Problem mit GetTickCount für Stoppuhr

  Alt 18. Jun 2012, 13:13
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.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Problem mit GetTickCount für Stoppuhr

  Alt 18. Jun 2012, 13:30
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Accipiper

Registriert seit: 18. Jun 2012
5 Beiträge
 
#7

AW: Problem mit GetTickCount für Stoppuhr

  Alt 18. Jun 2012, 13:31
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.

Geändert von Accipiper (18. Jun 2012 um 13:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Problem mit GetTickCount für Stoppuhr

  Alt 18. Jun 2012, 13:34
ts ist vom Typ byte, kann also niemals größer als 255 werden.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Accipiper

Registriert seit: 18. Jun 2012
5 Beiträge
 
#9

AW: Problem mit GetTickCount für Stoppuhr

  Alt 18. Jun 2012, 13:36
Super, das wars danke dir, habs als Integer definiert, jetzt funzt es!

Vielen Dank euch.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.991 Beiträge
 
Delphi 12 Athens
 
#10

AW: Problem mit GetTickCount für Stoppuhr

  Alt 18. Jun 2012, 13:59
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:19 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