Hallo,
ich habe eine Frage zu GetTickCount. Ich habe mal im Internet gelesen, man bräuchte bei GetTickCount eine Bereichsprüfung, da der Wert die Anzahl der Millisekunden seit dem Systemstart zurückgibt und der Bereich nach etwa 50 Tagen überschritten wird. GetTickCount liefert einen Uint32-Wert zurück, also eine Variable vom Typ Cardinal.
Was passiert, wenn der höchste Wert, also 4294967295 überschritten wird? Die Zählung beginnt von vorne!? Nun habe ich folgendes ausprobiert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Button1Click(Sender: TObject); Var c1, c2:cardinal; begin c1:=4294967295; c2:=10; ShowMessage(InttoStr(c2-c1)); end; |
Der Wert 11 wird (schätze ich mal) zurückgeliefert, da die Zählung bei 0 beginnt (0..10 sind 11 Ziffern). Es wird also, wie ich erwartet hätte, ein negativer Wert zurückgeliefert. Die Differenz stimmt bis aus die kleine Abweichung von einer Millisekunde.
Nun habe ich für die Zeitmessung folgenden Code geschrieben. Leider kann ich es aus Zeitgründen nicht testen
Aber eigentlich müsste das doch funktionieren. Oder habe ich etwas übersehen?
Delphi-Quelltext
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:
| type
TClock=record OldTick,NewTick, MilliSeconds, TimeElapsed:Cardinal; end; ... implementation Var Clock:TClock; ... procedure TForm1.Button2Click(Sender: TObject); begin Clock.OldTick:=GetTickCount; Clock.TimeElapsed:=0; Timer1.Enabled:=True; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin Clock.NewTick:=GetTickCount;
Clock.Milliseconds:=Clock.NewTick-Clock.OldTick; Clock.TimeElapsed:=Clock.TimeElapsed+Clock.MilliSeconds; Clock.OldTick:=Clock.NewTick; Form1.Caption:=IntToStr(Clock.TimeElapsed); end; |
Selbst wenn die Zeit um 1 Millisekunde abweicht, könnte ich damit gut leben.
Viele Grüße