Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zeitfunktion springt (https://www.delphipraxis.net/143531-zeitfunktion-springt.html)

Hedge 17. Nov 2009 21:38


Zeitfunktion springt
 
Ich lasse einen Timer laufen der alle 500 Sekunden mit folgender Funktion an 2 Labeln eine Zeit übergibt:

Delphi-Quellcode:
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;
Leider springen die Sekunden an einigen Stellen schnell von einer zur Anderen, also nicht so gleichbleibend wie man es sich wünschen würde.

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.

Bernhard Geyer 17. Nov 2009 21:43

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!

Hedge 17. Nov 2009 21:48

Re: Zeitfunktion springt
 
Ja genau daran habe ich auch gedacht.

Ist jetzt auch nicht DIE weltbewegende Funktion, aber gibt es Varianten zum TTimer?

uoeb7gp 17. Nov 2009 22:24

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.

uoeb7gp 17. Nov 2009 22:31

Re: Zeitfunktion springt
 
Sorry, hätte zuerst mal suchen sollen, diesen Thread hatten wir schon.

Siehe: http://www.delphipraxis.net/internal...t.php?t=103162

PS. das mit den < 1 msec (Präzision) ist so nicht korrekt, siehe vorherigen Post!

lg.

jfheins 18. Nov 2009 06:57

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 ...)

Bernhard Geyer 18. Nov 2009 07:02

Re: Zeitfunktion springt
 
Zitat:

Zitat von jfheins
Du könntest einfach das Intervall auf 1 Sekunde stellen

Wird aber dazu führen das ab und zu trotzdem sprünge sind wenn statt 1 Sekunde durchschnittliche 1,001 Sekunden zwischen Timer-Events vergehen.

himitsu 18. Nov 2009 10:01

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 05:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz