Entwickler-Ecke
Sonstiges (Delphi) - Timer - hängt manchmal
gd0123456 - So 09.02.14 03:29
Titel: Timer - hängt manchmal
Hi, hab mal eine Frage zur Timerkomponente. Ich hab zwei Timer. Einer mit dem Interval 1000 und einer mit dem Interval 100.
Schlussendlich soll er einfach nur die Sekunden zählen dann die Minuten etc....
Problem ist dass manchmal die Timer Funktion mit Interval 1000 für 1-2 Sekunden hängen bleibt so dass der Timer mit Interval 100 bereits weiter voran ist. Wo liegt da das Problem.
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: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
| procedure Ttoken_start_bsp.transform(sec: integer); var minute: integer; sekunde: integer; stunde: integer; begin
stunde := floor(sec/3600); if ((sec mod 3600) = 0) then begin edit5.text := inttostr(stunde); edit6.text := '0'; edit7.text := '0'; end else begin minute := floor((sec - (stunde*3600))/60); if (((sec - (stunde*3600)) mod 60) = 0 ) then begin edit6.text := inttostr(minute); edit7.text := '0'; end else begin sekunde := (sec - (stunde*3600)) mod 60; edit5.text := inttostr(stunde); edit6.text := inttostr(minute); edit7.text := inttostr(ceil(sekunde)); end; end;
end;
procedure Ttoken_start_bsp.Timer1Timer(Sender: TObject); begin transform(strtoint(edit8.text) div 1000); end;
procedure Ttoken_start_bsp.Timer2Timer(Sender: TObject); begin edit8.text := inttostr(strtoint(edit8.text)+100); end; |
Danke für die Hilfe.
rushifell - So 09.02.14 05:36
Hallo,
eine Timer-Komponente ist für eine genau Zeitmessung ungeeignet. Ich empfehle Dir stattdessen unter Windows GetTickCount oder noch besser den QueryPerformanceCounter zu verwenden. Für die Ausgabe kannst Du bei Bedarf eine Timer-Komponente verwenden. Wobei ich hierbei auch nur möglichst wenige Timer-Komponenten verwenden würde, im Idealfall nur eine.
Viele Grüße
gd0123456 - So 09.02.14 17:35
danke für die Info. Mir ist schon klar dass sie nicht genau ist. Mich wundert es einfach nur dass sie hängen bleibt und dann ein 2-3 Sekunden sind sie wieder synchron. dass ist was ich nicht ganz verstehe.
jaenicke - So 09.02.14 19:40
Ein Timer funktioniert so, dass das System eine Windows Nachricht in dem angegebenen Abstand in die Nachrichtenwarteschlange deines Programms einreiht. Je nachdem wie hoch die Auslastung des Systems gerade ist und wie beschäftigt dein Programm gerade ist, kann diese Nachricht nicht ganz pünktlich ankommen und wenn dein Programm gerade etwas macht, dauert es ggf. etwas die Nachricht zu verarbeiten.
Deshalb ist der Zeitabstand beim Timer ungeeignet für eine Zeitmessung oder ähnliches. Wenn man genaue Abstände benötigt, kann man den Timer auf eine höhere Frequenz einstellen und darin dann die Zeiten anhand von GetTickCount, dem Performance Counter oder der Uhrzeit prüfen.
Delete - Mo 10.02.14 12:21
Genau :beer:
Mit anderen Worten: Man mißt nicht mit einem Timer, sondern löst damit ein Ereignis aus. Das sagt ja bereits der Name: Es ist ein Timer und keine Uhr, Watch, Clock etc. Ein Timer ist sozusagen für das Timing verantwortlich.
In der Ereignisbehandlung des Timers fragt man z.B. das Instrument ab, das die Zeit mißt, nämlich die interne Uhr des Computers, die sowieso immer läuft. Noch anders ausgedrückt: Mit einem Timer setzt man lediglich ein Meßintervall; es soll z.B. jede Sekunde gemessen werden. Z.B. beim Programmieren eines Weckers: Der Timer ist nicht die Uhr, sondern fragt nur ständig bei der Uhr nach: "Ist es jetzt endlich soweit?"
Will man die Dauer von Methoden, Proceduren, Funktionen etc. messen, benötigt man dagegen keinen Timer: Man merkt sich einfach den TDateTime-Wert des Beginns und den am Ende. Zur Ermittlung der vergangenen Zeit gibt es in der Unit DateUtils die beiden Funktionen SecondsBetween und MilliSecondsBetween, die die Zeit zwischen zwei Zeitpunkten zurückliefern.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!