Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Event bei Minutenwechsel der Windows-Uhr? (https://www.delphipraxis.net/211742-event-bei-minutenwechsel-der-windows-uhr.html)

AuronTLG 28. Okt 2022 15:12

Event bei Minutenwechsel der Windows-Uhr?
 
Hallo,

ich bin gerade dabei, in einem Programm eine Art Alarm-Funktion zu verbessern.
Momentan läuft die noch so, dass mit einem minütlichen Timer überprüft wird, ob der eingestellte Zeitpunkt gekommen ist.
Mich würde interessieren, ob es möglich wäre, statt des Timers den notwendigen Code immer dann auszuführen, wenn die Windows-Uhr ihren Minutenwechsel macht, damit es auch wirklich passend zur Systemzeit kommt.
Ich würde erwarten, dass es dafür ein WinAPI-Event gibt, habe bisher aber noch nichts gefunden.

Deswegen mal die Frage: Weiß wer was dazu?

himitsu 28. Okt 2022 15:19

AW: Event bei Minutenwechsel der Windows-Uhr?
 
Da Windows selber keine Messages/Notifications rausschickt, wenn die Uhr sich "normal" ändert (abgesehn bei Änderung von Datum/Uhrzeit, z.B. durch die Zeitaktualisierung aus einem Zeitserver oder bei Sommer-/Winterzeit)
Nein.

Viele lassen im Hintergrund einen Timer oder Thread laufen, welcher z.B. sekündlich tickt und bei Änderung der Minute, lösen sie dann eine Aktion aus. (oder eben zu gewissen Zeitpunkten)


Man kann einen Timer auch so starten/neustarten, dass er mit der Differenz zum gewünschten Zeitpunkt wartet,
bzw. im Zeitthread die Millisekunden bis zur nächsten Minute berechnen, dann passend ein WaitFor und nach dem Event wieder erneut die nötige Pause ausrechnen usw. (MSDN-Library durchsuchenCreateEvent oder Delphi-Referenz durchsuchenTEvent)

Uwe Raabe 28. Okt 2022 15:47

AW: Event bei Minutenwechsel der Windows-Uhr?
 
Vermutlich muss man einen Kompromiss zwischen Genauigkeit und Aufwand finden. So kann man sich mit einem dynamischen Timer (z.B. 59 Sekunden gefolgt von bis zu 10x 100ms) ziemlich genau herantasten. Ist dann wirklich mal viel zu tun, kommt der Alarm eben ein paar Millisekunden später. Wenn es dabei lediglich um die Benachrichtigung lebender Personen mit normaler Reaktionszeit geht, sollte das nicht relevant sein.

AuronTLG 28. Okt 2022 15:49

AW: Event bei Minutenwechsel der Windows-Uhr?
 
Alles klar, danke.
Ich hatte gehofft, es gäbe vielleicht eine simple Lösung.
Dann überlege ich mir mal, wie genau ich es haben möchte.

Delphi.Narium 28. Okt 2022 16:26

AW: Event bei Minutenwechsel der Windows-Uhr?
 
Delphi-Quellcode:
function CalcTimerInterval(iTimerInterval : Integer) : Integer;
Var
          dNow : Double;
begin
  // Interval setzen
  // Tagesdatum und Uhrzeit holen
  dNow := Now;
  // Den Tagesanteil holen (= Nachkommastellen).
  dNow := dNow - Trunc(dNow);
  // Rest bis Mitternacht holen.
  dNow := 1 - dNow;
  // Nachkommastellen mal Millisekunden pro Tag
  Result := Trunc(dNow * 86400000);
  // wir benötigen den Rest bis zum angegeben Interval, damit der Timer
  // zur nächsten Minute, Stunde, 0 Uhr ... aktive wird.
  Result := (Result mod Max(iTimerInterval,1));
end;

procedure Form1.Timer1Timer(Sender : TOBject);
begin
  Timer1.Enabled := false;
  // Machen, was immer zu machen ist.
  Timer1.Interval := CalcTimerInterval(60000); // für eine Minute
  Timer1.Enabled := true;
end;
Fehlertoleranz: +-/ 1 Millisekunde. Deutlich einfacher und resourcenschonender als per wiederholtem Timeraufruf mit kleinerwerdendem Intervall hoffentlich einen bestimmten Zeitpunkt möglichst genau zu treffen.

Zeit läuft in einen definierten Tempo ab.
Zeit ist berechenbar.
Per Berechnung kann man somit beliebige Zeitdifferenzen ermitteln.
Per Computer ist das nur simple Mathematik.

Als Mensch muss man, um pünklich zu sein, wiederholt auf die Uhr schauen. (Per verändertem AufDieUhrSchauIntervall möglichst pünktlich sein - und das klappt oft auch nicht wirklich richtig ;-)).

Der Computer kann die Zeitdifferenz einmal berechnen und sich per Timer drauf verlassen, dass er pünktlich ist ;-)

Und wenn zwischenzeitlich wer an der Uhr dreht und meint die Zeit verstellen zu müssen, scheitern beide (bis zum nächsten Intervall ;-))

TomyN 28. Okt 2022 21:58

AW: Event bei Minutenwechsel der Windows-Uhr?
 
Ich würde mal in die Docu zu CreateWaitableTimer schauen, da kann man eine Absolutzeit angeben bei der der Timerevent kommt.

Rollo62 29. Okt 2022 09:01

AW: Event bei Minutenwechsel der Windows-Uhr?
 
Bei solchen Zeit-Problemen frage ich mich immer was prinzipiell die bessere Lösung wäre, und warum:
1. Timer-Lösung
2. Thead-Lösung, s.B. mit Sleep

Vielleicht kann das hier jemant aufklären ?

Ich persönlich tendiere auch ehere zu Timern, weil das in der Regel weniger Probleme macht.

TomyN 29. Okt 2022 10:11

AW: Event bei Minutenwechsel der Windows-Uhr?
 
Oder Thread mit Timer :-)

Gefühlsmässig halte ich Sleep für sehr unpräzise, kann es aber nicht begründen.

dummzeuch 29. Okt 2022 10:33

AW: Event bei Minutenwechsel der Windows-Uhr?
 
Zitat:

Zitat von TomyN (Beitrag 1514042)
Ich würde mal in die Docu zu CreateWaitableTimer schauen, da kann man eine Absolutzeit angeben bei der der Timerevent kommt.

Genaugenommen setzt man die Zeit in SetWaitableTimer.

Aber Du hast Recht, das scheint mir auch die beste Lösung zu sein.

KodeZwerg 29. Okt 2022 10:36

AW: Event bei Minutenwechsel der Windows-Uhr?
 
Zitat:

Zitat von Rollo62 (Beitrag 1514051)
Bei solchen Zeit-Problemen frage ich mich immer was prinzipiell die bessere Lösung wäre, und warum:
1. Timer-Lösung
2. Thead-Lösung, s.B. mit Sleep

Vielleicht kann das hier jemant aufklären ?

Ich persönlich tendiere auch ehere zu Timern, weil das in der Regel weniger Probleme macht.

Timer ist sehr resourcenschonend also würde ich als WinAPI-Fan einem Thread in diesem Fall bevorziehen.
Sleep in einem Thread ist auch okay, wenn man Sleep wie in Delphi.Nariums Beispiel anpasst auch präzise genug (wenn es sich nicht um ein paar verlorene millisekunden geht...)
Zitat:

Zitat von TomyN (Beitrag 1514054)
Oder Thread mit Timer

Thread mit Timer, noch nie probiert, kannst Du da mal ein Beispiel für machen wie das funktioniert?

Auch noch zu erwähnen, was man machen kann wenn es nicht total ultra präzise sein muss...
WaitForSingleObject() bzw WaitForMultipleObjects() bzw per Event MsgWaitForMultipleObjects() sofern man sich in die WinAPI begeben möchte 8-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:19 Uhr.
Seite 1 von 2  1 2      

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