![]() |
Zeitfunktion springt
Ich lasse einen Timer laufen der alle 500 Sekunden mit folgender Funktion an 2 Labeln eine Zeit übergibt:
Delphi-Quellcode:
Leider springen die Sekunden an einigen Stellen schnell von einer zur Anderen, also nicht so gleichbleibend wie man es sich wünschen würde.
function FormatTime(ZeitDifferenz:UInt64): String;
var iSekunden,iMinuten,iStunden:UInt64; begin Zeitdifferenz:=Ceil(ZeitDifferenz div 1000); iSekunden:=ZeitDifferenz mod 60; ZeitDifferenz:=trunc(ZeitDifferenz / 60); iMinuten:=ZeitDifferenz mod 60; ZeitDifferenz:=trunc(ZeitDifferenz / 60); iStunden:=ZeitDifferenz mod 24; ZeitDifferenz:=trunc(ZeitDifferenz / 24); result:=IntToStr(ZeitDifferenz)+'d, '+IntToStr(iStunden)+'h, '+IntToStr(iMinuten)+'m, '+IntToStr(iSekunden)+'s'; end; Wenn ich die Interval-Zeit auf 100ms reduziere dann geht es vernünftig, aber ich will so wenig Prozessorzeit wie möglich verschwenden dafür. |
Re: Zeitfunktion springt
Der durch TTimer zur verfügung gestellte Timer ist nicht sehr genau (16 ms-Raster).
z.B. der Timer kommt um 12:00:00,990 -> Anzeige: 12:00:00 12:00:01,499 -> Anzeige: 12:00:01 12:00:02,001 -> Anzeige: 12:00:02 -> 12:00:01 war nur für ca. 0,5 Sekunden sichtbar! |
Re: Zeitfunktion springt
Ja genau daran habe ich auch gedacht.
Ist jetzt auch nicht DIE weltbewegende Funktion, aber gibt es Varianten zum TTimer? |
Re: Zeitfunktion springt
Hi, Präzision ist abhängig von.
1. Präemtives Multitasking, ein Prozess bekommt folgende Rechenzeit vom Win32 Task-Scheduler zugeteilt. Bei Desktop OS 15 ms. Server OS 30 msec D.h. Je mehr Prozesse die Zugeteilte Rechenzeit auch verbrauchen, desto weniger genau arbeitet das Timerevent. Win32 ist kein Echtzeit-Betriebssystem. 2. Auslastung und Prioritätsboost der einzelnen Prozesse und Threads im System sind zu berücksichtigen. timeSetEvent bei Verwendung einer Callback Funktion und Priority TIME_CRITICAL des Mainprozesses, ergibt die größte Genauigkeit, ohne zusätzlich zuviel an Rechenzeit zu verbrauchen. Parameter uResolution berücksichtigen. Also eine Genauigkeit im USER-Mode kleiner 15 msec ist nicht ohne die Altagstauglichkeit des OS einzuschränken möglich. Ring0 implementierungen da mit Delphi nicht ohne Kopfstände möglich, seien mal hinten angestellt. MMRESULT timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, DWORD dwUser, UINT fuEvent ); lg. |
Re: Zeitfunktion springt
Sorry, hätte zuerst mal suchen sollen, diesen Thread hatten wir schon.
Siehe: ![]() PS. das mit den < 1 msec (Präzision) ist so nicht korrekt, siehe vorherigen Post! lg. |
Re: Zeitfunktion springt
Du könntest einfach das Intervall auf 1 Sekunde stellen - dann bist du zwar der echten zeit um einen Hauch hinterher, aber die Uhr läuft ruhig ;)
(Und 500ms Verzögerung sollte man für die Anzeige noch verschmerzen können ...) |
Re: Zeitfunktion springt
Zitat:
|
Re: Zeitfunktion springt
Nimm einen Timer mit 100 oder 50 ms, dann fällt das Springen fast nicht auf, denn 10 bis 20 Mal pro Sekunde guckt eh keiner drauf. :lol:
(bei 100 ms dauert das "Springen" ja nur eine 10-tel Sekunde, bis die Zeit wieder stimmt) Und von der CPU-Belastung ist es auch noch verträglich und notfalls kann man auch noch eine Zeitsperre einbauen, welche dann in der Timerereignisprozedur nochmals die Sekunden prüft und nur bei Änderung den Rest ausführt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz