Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Timer läuft ab Mitternacht rückwärts

  Alt 1. Sep 2015, 15:00
Ich weiß nicht wie genau du es brauchst. Ist die Regelmäßigkeit wichtig? Dann ist ein Timer (bzw. GetTickCount() ) nicht grade die beste Wahl, denn das ist, glaube ich, nur auf eine 64stel-Sekunde genau. Daher würde ich auch auf den Interval des Timers aufpassen, sodass es am besten glatt aufgeht.

Oder ist dir die Erfassung der genauen Zeitspanne wichtig? Dann würde ich nicht mit TDateTime arbeiten, da treten ja schon Rundungsfehler bei Millisekunden auf. Für die Erfassung eines Zeitbereichs gibt es TTimeSpan, da kannst du bequem bis auf Ticks heruntergehen:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
   tickCount:   DWORD;
   ticksPassed: Int64;
begin
   tickCount := WinApi.Windows.GetTickCount();
   ticksPassed := (tickCount - lastTickCount) * TTimeSpan.TicksPerMillisecond;
   timePassed := timePassed.Add( TTimeSpan.Create(ticksPassed) );

   Caption := String.Format(
      'Time passed: %.2d:%.2d:%.2d (%d ms, %d ticks)', [
      timePassed.Hours,
      timePassed.Minutes,
      timePassed.Seconds,
      timePassed.MilliSeconds,
      timePassed.Ticks
   ]);
   lastTickCount := tickCount;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   timePassed := TTimeSpan.Zero;
   lastTickCount := Winapi.Windows.GetTickCount();
end;
Da sieht man auch ganz gut wie es mit einem Timer-Intervall von 750ms immer glautt aufgeht, mit 700 allerdings krumm wird. Kurz nachrechnen, eine 64stel-Sekunde sind 15,625 ms, jepp, geht bei 750 glatt auf, bei 700 nicht.
  Mit Zitat antworten Zitat