| Autor |
Beitrag |
-delphin-
      
Beiträge: 200
|
Verfasst: Fr 07.10.05 19:41
Hi, also ich hab rein aus Spaß an der Freude ein Prog geschrieben, das schlicht die Hundertstel hochzählt und dann Sekunden erhöht usw, eine Art Stoppuhr also.
Was mir dabei aufgefallen ist, ist folgendes:
Ich hab die Uhr mit der Timerkomponenten gemacht (also zeit := zeit + 1, Interval auf 1 gestellt und so weiter). Jedoch war die Uhr sehr ungenau, ich hab bei 100 hundertstel Sekunden eine Sekunde erhöhen lassen und es hat sich so arg unterschieden, dass ich das angepasst habe; der Wert bei dem es wenigstens bei den Sekunden einigermaßen (Abweichung: Eine Sekunde in 3 Minuten) gepasst hat war die Erhöhung bei 63 / 64 Hundertstel, d.h. locker 0,37 Sekunden Differenz.
Rein aus Interesse: Woran liegt das? =)
|
|
mg80s
      
Beiträge: 33
WinXP SP2
Delphi 6 Personal ;) , C# (VS 2003 Prof.)
|
Verfasst: Fr 07.10.05 19:47
Ich könnte mir vorstellen, dass TTimer bei Auslastung des Programms auch ins Stocken geraten kann, ist aber nur ne Vermutung. Gerade wenn Du zB die Hunderstel immer als Label anzeigen willst (falls Du das tust), ist das ja doch ganzschön Aufwand und da könnte es ja schonmal passieren, dass das ganze Programm nicht mehr hinterherkommt.
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: Fr 07.10.05 19:53
Die Timer-Botschaften sind Windows-Botschaften mit niedriger Priorität. Das heißt, es werden erst die meisten anderen Botschaften abgearbeitet, dann die Timer-Botschaften. Ich würde auf die Systemzeit zurückgreifen. Beim Starten wird gespeichert, auf welchem Wert die Systemuhr stand, der Timer wird nur noch zur Aktualisierung der Anzeige gebraucht.
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
-delphin- 
      
Beiträge: 200
|
Verfasst: Fr 07.10.05 20:13
Also hängt es mit der Auslastung des Computers zusammen? Ja, ich lasse jede Hundertstel als Label anzeigen =)
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 07.10.05 20:19
Dr Timer hat sowieso nur eine Auflösung von ca 10 ms unter NT und ca. 40 ms unter Consumer Windows.
|
|
hallo
      
Beiträge: 450
WIN XP, SuSE 9.3
D3 Prof, D6 Pers, 2005 Pers
|
Verfasst: So 09.10.05 10:28
Rechne am besten über Zeitdifferenz!
Also wenn es jetzt 12:00:00:000 ist wie er angefangen hat und es jetzt 12:01:10:100 ist, dann ist der Zeitabstand 1 Min 10 Sec und 100 ms !
_________________ Der beste je Programmierte Trojaner: Windows XP
Wäre es nicht adequat, den Usus heterogener Termini zu minimieren?
|
|
Heiko
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: So 09.10.05 10:36
Ich mache es immer so (und die so ziemlich genau  ):
1. Beim Start der Zeitmessung GetCurrentTime in einer Variablen speichern
2. Eine Endlosschleife, in der die Zeitdifferent von der eingespeicherten Zeit zum aktuellen Wert von GetCurrentTime genommen wird und danach von ms in die gewünschte Zeitanzeige umgewandelt wird. Des weiteren muss in der Schleife ein Application.ProcessMessages oder Application.MessageHandle sein, damit die Schleife sich auch noch beenden lässt. Und falls er dir zu schnell zählt baust du noch sleep in die Schleife ein, um die Prozessorlast zu senken  .
3. Die Beenden Variable zum Beenden der Schleife noch einbauen 
|
|
Tilo
      
Beiträge: 1098
Erhaltene Danke: 13
Win7 geg. WInXP oder sogar Win98
Rad2007
|
Verfasst: So 09.10.05 10:44
@Heiko
Systemfreundlicher wäre es dann die Berechnung der Zeitdifferenz über ein OnTimerEreigniss zu regeln und das Intervall auf 10ms zu setzen. Dann wird kein Sleep, keine Abbruchsvariable und kein Application.ProcessMessages benötigt.
|
|
Heiko
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: So 09.10.05 10:53
Es hängt davon ab, was man machen will, besser gesagt wofür man es braucht. Wer z.B. einen ziemlich genauen Timer braucht, ist damit besser beraten, ansonsten kann man es auch übern normalen Timer machen, allerdings sind die Aufrufe nicht ganz so gleichmäßig aus dem hier bereits genannten Grund.
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: So 09.10.05 12:05
Tilo hat folgendes geschrieben: | @Heiko
Systemfreundlicher wäre es dann die Berechnung der Zeitdifferenz über ein OnTimerEreigniss zu regeln und das Intervall auf 10ms zu setzen. Dann wird kein Sleep, keine Abbruchsvariable und kein Application.ProcessMessages benötigt. |
was systemfreundlicheres als sleep gibt's gar nicht 
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
Heiko
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: So 09.10.05 17:07
Sehe ich eigentlich auch so, da der Prozessor dann weniger verschleißt, da er nicht so belastet wird  .
|
|
Tilo
      
Beiträge: 1098
Erhaltene Danke: 13
Win7 geg. WInXP oder sogar Win98
Rad2007
|
Verfasst: So 09.10.05 17:49
Heiko hat folgendes geschrieben: | Sehe ich eigentlich auch so, da der Prozessor dann weniger verschleißt, da er nicht so belastet wird . |
Noch verschleißarmer:
herrunterfahren und in die Vitrine stellen.
|
|
Heiko
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: So 09.10.05 17:52
Dann haste aber keine StoppUhr mehr 
|
|