Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Auf Datumswechsel reagieren (https://www.delphipraxis.net/148852-auf-datumswechsel-reagieren.html)

maximus Caesar 9. Mär 2010 20:21


Auf Datumswechsel reagieren
 
Hallo zusammen.
Ich schirebe gerade ein Programm das auf den Datumswechsel reagieren soll (Also wenn sich das Datum ändert, während das Programm läuft).
Bin schon den halben Tag auf der Suche nach einer Lösung und habe bis jetzt nichts gefunden, außer WM_TIMECHANGE das aber nichts bringt, da hier nur ein manueller Wechsel berücksichtigt ist.

Kann mir jemand helfen?
Achja, Timer sollte es nicht sein...

MfG

Luckie 9. Mär 2010 20:33

Re: Auf Datumswechsel reagieren
 
Herrlich so was liebe ich. Warum schließt du die einfachste Lösung aus? Gibt es dafür einen Grund? Ohne dass dein Programm regelmäßig das Datum überprüft , wirst du einen Datumswechseln nicht mitbekommen.

Klaus01 9. Mär 2010 20:35

Re: Auf Datumswechsel reagieren
 
Guten Abend,

was spricht gegen einen Timer?
Das Intervall ist anpassbar - so kannst Du erst in einem großen
Intervall prüfen ob eine Datumswechsel ansteht (Uhrzeit) und dann
das Intervall entsprechend verkleinern.
Oder das Intervall gleich auf die Differenz 24:00 - jetzige Uhrzeit stellen.

Grüße
Klaus

Jens Hartmann 9. Mär 2010 20:36

Re: Auf Datumswechsel reagieren
 
Hallo,

aber wie willst Du es dann ohne Timer realisieren. Irgendeine Komponente muss dir ja die arbeit abnehmen und prüfen ob das Datum noch aktuell ist.

Wenn Du es beim Programmstart durchführen willst, dann könntest Du das ja über den Timer.Interval lösen. In etwa so könnte es dann gehen.

Timer.Interval

Du legst beim Start den Interval bis zum nächsten Datumswechsel (24:00:00 Uhr) fest. Dann im TimerOn Ereignis den Interval auf 24 Stunden später.
Allerdings musst Du den Fehler im Timer berücksichtigen, der wird mit der Zeit aus dem Datumswechsel laufen. Daher vieleicht immer im TimerOn Ereignis neu mit

Delphi-Quellcode:
      SendEMailTimer1.Interval := MilliSecondsBetween(frac(StrToTime(TimeNow)),
        frac(StrToTime(TimeSend)));
initialisieren.


Gruß Jens

Valle 9. Mär 2010 20:44

Re: Auf Datumswechsel reagieren
 
Zitat:

Zitat von Luckie
Herrlich so was liebe ich. Warum schließt du die einfachste Lösung aus? Gibt es dafür einen Grund? Ohne dass dein Programm regelmäßig das Datum überprüft , wirst du einen Datumswechseln nicht mitbekommen.

Weil man Polling wenn möglich vermeiden sollte. Und vor allem wenn es ja eventuell (Und das ist seine Frage) eine Möglichkeit gibt, ein Callback oder Ähnliches bereitzustellen. Da muss man nicht gleich abfällig werden. Ich finde es gut, wenn sich jemand Gedanken darum macht, auf unschöne Programmier-Methoden zu verzichten. Dass es um das Polling dabei leider nicht drumrum kommt, konnte er ja nicht wissen. :roll:

Edit:// Achja, um noch was Produktives beizutragen: Ich würde in diesem Fall eher zum Polling als zu einem u.U. sehr hohen Timer-Intervall raten. Ich weiß nicht, wie Windows die Timer intern behandelt, aber ich fürchte, dass die Differenz zum echten Datumswechsel teilweise sehr hoch werden kann. (z.B. wenn der Rechner mal kurz vor dem Absturz steht) Ansonsten stellt sich eben die Frage, wie genau du auf den Datumswechsel reagieren möchtest. :-)

Liebe Grüße,
Valle

Luckie 9. Mär 2010 20:46

Re: Auf Datumswechsel reagieren
 
Das ist ja auch in Ordnung. Was mich nur stört ist, dass so was immer ohne Begründung da steht.

Jens Hartmann 9. Mär 2010 21:00

Re: Auf Datumswechsel reagieren
 
Zitat:

Zitat von Valle
Ich würde in diesem Fall eher zum Polling als zu einem u.U. sehr hohen Timer-Intervall raten.

Da stimme ich Dir natürlich zu. Je nach Genauigkeit des Interval, ist eine Polling aufjedenfall besser. Allerdings natürlich auch aufwendiger.

Und wenn es mir nicht auf die Sekunde genau ankommt, kann ich ja den Interval, kurz nach dem Datumswechsel neu berechnen lassen. Somit ist zumindestens gewährleistet, das ich nicht komplett aus dem Zyklus laufe. Und je nach Anwendung ist es ja auch egal, ob es 00:00:00 oder 00:00:35 ist, oder halt auch 00:01:12.

Gruß Jens

maximus Caesar 9. Mär 2010 22:06

Re: Auf Datumswechsel reagieren
 
Zitat:

Zitat von Luckie
Das ist ja auch in Ordnung. Was mich nur stört ist, dass so was immer ohne Begründung da steht.

Jup, hätt ich dazu schreiben sollen.
Gibts denn eine Quelle zu dem "Polling", finde leider nichts.
Die Genauigkeit ist nicht so wichtig, mir kommts eher auf die Prozessor und Akku Belastung an.
Und schonmal vielen Dank für die guten Antworten!

Valle 9. Mär 2010 22:11

Re: Auf Datumswechsel reagieren
 
Zitat:

Zitat von maximus Caesar
Gibts denn eine Quelle zu dem "Polling", finde leider nichts.

Polling bedeutet, eine bestimmte Information in regelmäßigen Abstand abzufragen. Wenn du alle 3 Minuten schaust, ob sich das Datum geändert hat oder ob du eine neue E-Mail bekommen hast, dann ist das Polling. Wenn du per SMS über eine E-Mail informiert wirst, oder ein Callback für den Datumswechsel registrierst, dann ist das kein Polling.

Polling sollte man nach Möglichkeit vermeiden. Bei einfachen Sachen wie Datumswechsel ist das nicht weiter tragisch, aber beim zeitempfindlichen Anwendungen oder auch kostenintensiven Sachen (zB. E-Mail mit dem Handy holen) ist das schon wichtiger. Du hast ja offensichtlich schon aus dem Bauch heraus alles richtig machen wollen. :-)

Liebe Grüße,
Valle

maximus Caesar 9. Mär 2010 22:14

Re: Auf Datumswechsel reagieren
 
Danke!
Kannte dafür nur den Begriff noch nicht :-D

Reinhard Kern 10. Mär 2010 09:31

Re: Auf Datumswechsel reagieren
 
Zitat:

Zitat von Jens Hartmann
Du legst beim Start den Interval bis zum nächsten Datumswechsel (24:00:00 Uhr) fest. Dann im TimerOn Ereignis den Interval auf 24 Stunden später.

Hallo,

das hat allerdings den Nachteil, dass nur reguläre Datumswechsel erkannt werden, aber keine manuelle Verstellung oder Umstellung auf die bescheuerte Sommer/Winterzeit. Daher würde ich doch etwa jede Minute mal nachschauen, die Belastung für das System durch einen Aufruf von GetTime ist verschwindend.

Gruss Reinhard

Luckie 10. Mär 2010 10:02

Re: Auf Datumswechsel reagieren
 
Zitat:

Zitat von maximus Caesar
Zitat:

Zitat von Luckie
Das ist ja auch in Ordnung. Was mich nur stört ist, dass so was immer ohne Begründung da steht.

Jup, hätt ich dazu schreiben sollen.

Ja und was ist jetzt die Begründung?

maximus Caesar 10. Mär 2010 10:33

Re: Auf Datumswechsel reagieren
 
Das ich wenn möglich lieber auf eine Meldung des Systems reagire als einen Timer zu benutzen, wie bereits vermutet.
Kannte zwar den Begriff Polling noch nicht, aber genau das wollte ich vermeiden.

DeddyH 10. Mär 2010 10:36

Re: Auf Datumswechsel reagieren
 
Aber welche Message sollte das sein? Angenommen, Windows würde per Broadcast alle Fenster informieren, wenn sich die Zeit geändert hat, dann käme es ja zu nix anderem mehr, denn die Zeit ändert sich ja ständig.

maximus Caesar 10. Mär 2010 10:43

Re: Auf Datumswechsel reagieren
 
Mit der Zeit hab ich ja auch nicht gerechnet. Mir war nur das Datum wichtig, und habe gehofft das Windows beim Datumswechsel eine entsprechende Information sendet.

DeddyH 10. Mär 2010 10:50

Re: Auf Datumswechsel reagieren
 
Versteh mich nicht falsch, ich kann Dein Ansinnen ja nachvollziehen, aber wenn es dafür eine Message geben sollte (ich kenne keine, aber das muss ja nichts heißen), dann müsste es konsequenterweise auch eine für Monats-/Jahreswechsel geben. Spinnt man das etwas weiter, komme ich auf Stunden, dann Minuten, dann Sekunden usw., denn es gibt immer jemanden, der das gerne auswerten würde ;)

Sharky 10. Mär 2010 10:54

Re: Auf Datumswechsel reagieren
 
Hai,


bekomme ich das nicht über DTN_DATETIMECHANGE in einem WM_NOTIFY mit?

DeddyH 10. Mär 2010 10:57

Re: Auf Datumswechsel reagieren
 
Zitat:

DTN_DATETIMECHANGE
This message is sent by a date and time picker (DTP) control whenever a change occurs. It is sent in the form of a WM_NOTIFY message.
Sieht nicht so aus, oder ich hab einen Artikel überlesen.

Jens Hartmann 10. Mär 2010 12:16

Re: Auf Datumswechsel reagieren
 
Zitat:

Zitat von Reinhard
Zitat:

Zitat von Jens Hartmann hat folgendes geschrieben:
Du legst beim Start den Interval bis zum nächsten Datumswechsel (24:00:00 Uhr) fest. Dann im TimerOn Ereignis den Interval auf 24 Stunden später.

Hallo,

das hat allerdings den Nachteil, dass nur reguläre Datumswechsel erkannt werden, aber keine manuelle Verstellung oder Umstellung auf die bescheuerte Sommer/Winterzeit. Daher würde ich doch etwa jede Minute mal nachschauen, die Belastung für das System durch einen Aufruf von GetTime ist verschwindend.

Gruss Reinhard

Da gebe ich Dir recht. Nur wie gesagt, es kommt immer auf die Genauigkeit an. Wenn ich zweimal im Jahr darauf verzichten kann, das eine Stunde Zeitverschiebung OK ist, dann gut. Ich würde ja die Berechnung auch jeden Tag neu ausführen lassen. Ansonsten habe ich das Problem, das der Timer gegebüber der Rechnerzeit verläuft.

Gruß Jens

s.h.a.r.k 10. Mär 2010 12:20

Re: Auf Datumswechsel reagieren
 
Bau dir halt eine Polling-Klasse, die dir dann eine Message schickt (oder eine Callback-Möglichkeit bereitstellt), wenn ein neuer Tag anbricht, oder wenn der User die Zeit geändert hat. Diese Klasse kommt dann in die Codelib und jedem ist geholfen :mrgreen:

BTW: Wie ist das eigentlich wenn Windows die Zeit synchronisiert? Wird da auch eine Message geschickt.

p80286 10. Mär 2010 12:47

Re: Auf Datumswechsel reagieren
 
Ist ja alles sehr interessant, aber wofür soll das überhaupt gut sein?
Abgesehen von einem Kalender/Uhr-Simulator kann ich mir (mit meiner eingeschränkten Phantasie) keine Anwendung für einen "immidiateDatechange" vorstellen. Naja das KalifornischeE-Netz am Freitag den 13. März um 0 Uhr herunter zu fahren ist auch etwas.

Gruß
K-H

s.h.a.r.k 10. Mär 2010 12:49

Re: Auf Datumswechsel reagieren
 
Was ist, wenn deine Anwendung abhängig von der Uhrzeit ist? Da kann es durchaus einige Dinge geben, wie z.B. ein automatisch angestoßenes Backup um 0 Uhr oder erzeugen eines Reports etc.

[edit] Oder lass es ein Kalender mit Erinnerungsfunktion sein.

p80286 10. Mär 2010 13:00

Re: Auf Datumswechsel reagieren
 
@s.h.a.r.k
für einen Backup ist das Datum ziemlich egal, wie Du schreibst um 0Uhr (kann ja auch 0.30Uhr oder was auch immer sein) da geht's "nur" um die Uhrzeit.

Und wenn es ein Kalender ist, dann hat er eben eine (Timergestütze) Schleife, die Uhrzeit und Datum abfragt, das ist ja auch seine Hauptaufgabe.

Da fällt mir ein, irgendwo hab ich mal was über einen "weckerinterrupt" oder "-message" oder was auch immer gelesen. Was macht eigentlich der eingebaute Scheduler? der pollt doch bestimmt nicht alle 20stel Sekunde die Uhrzeit und das Datum?

Gruß
K-H

Sherlock 10. Mär 2010 14:19

Re: Auf Datumswechsel reagieren
 
OK, dann hak ich mal kurz hier ein: Nur weil man die Timerabfrage jetzt pollen nennt, ist sie plötzlich gut? Warum ist überhaupt ein Timerevent pro (sagen wir mal) Sekunde böse? Ich versteh die Aufregung nicht: entwickelt Ihr ale Echtzeitsysteme, wo häufige Timerevents katastrophale Folgen haben können (davon abgesehen, daß Windows kein Echtzeit-OS ist)? Oder ist die Diskussion eher akademischer Natur?
In meiner Firma hatte es sich bereits zu Win 3.11 Zeiten eingebürgert, daß alle Applikationen die Uhrzeit in einer Statuszeile anzeigen. Diese wurde/wird einmal die Sekunde aktuaisiert...mit keinen sichtbaren folgen für das Programm, oder das restliche System. OK, wir haben keine Multimediaanwendunden oder Anlagensteuerungen, nur Dokumentationssysteme. Aber klärt mich doch trotzdem mal bitte auf, was so brutal an nem Timerintervall von zB 1000 ist.

:gruebel:

Sherlock

s.h.a.r.k 10. Mär 2010 14:45

Re: Auf Datumswechsel reagieren
 
An sich wahrscheinlich nichts, aber eine Callback-Routine wäre an manchen Stellen einfach etwas sauberer, was ich verstehe. Aber an der Stelle gibt es wahrlich zwei Parteien, die aufeinander prallen :wink: Selbst wenn es um String-Konkatenation geht ist das ja so. Ich vertrete ganz gerne die Ansicht, dass der Benutzer durchaus mal eine ein zwei Sekunden das Programm nicht bedienen können muss, wenn er denn weiß, was im Hintergrund geschieht.

Zudem erzeugt selbst ein Interval mit 200ms keine hohe Last, wenn keinerlei großartigen Berechnungen anstehen, da muss ich dir Recht geben.

BTW: Ich würde das Timerinterval sogar kleiner setzen, da TTimer ja nicht immer *genau* nach einer Sekunde triggert. Das beste Ergebnis sieht man an der Windows-Uhranzeige. Bei XP war es so, dass der Sekundenzeiger auch mal 1,3 Sekunden oder weniger als eine Sekunde gebraucht hat um umzuschalten :mrgreen:

Reinhard Kern 10. Mär 2010 17:05

Re: Auf Datumswechsel reagieren
 
Zitat:

Zitat von s.h.a.r.k
BTW: Ich würde das Timerinterval sogar kleiner setzen, da TTimer ja nicht immer *genau* nach einer Sekunde triggert. Das beste Ergebnis sieht man an der Windows-Uhranzeige. Bei XP war es so, dass der Sekundenzeiger auch mal 1,3 Sekunden oder weniger als eine Sekunde gebraucht hat um umzuschalten :mrgreen:

Hallo,

es gab menschliches Leben auch vor der Einführung von Funkuhren und Internet. Ich kenne zwar auch jemand, der körperlich leidet, wenn nicht alle Uhren in seinem Haushalt exakt die gleiche Zeit anzeigen und synchron umspringen, aber das ist keine Aufgabe für Softwarenentwickler und Administratoren, das ist eine Krankheit. Bei vernetzten technischen Systemen kann das anders sein, aber so arg viele gibt es da nicht.

Gruss Reinhard

Basilikum 10. Mär 2010 20:30

Re: Auf Datumswechsel reagieren
 
eine elegante Variante (ohne Polling) wäre ein separater Thread, der auf den Datumswechsel wartet und dann die entsprechende Aktion ausführt:
MSDN-Library durchsuchenCreateWaitableTimer
MSDN-Library durchsuchenSetWaitableTimer
MSDN-Library durchsuchenWaitForSingleObject

Valle 10. Mär 2010 21:21

Re: Auf Datumswechsel reagieren
 
Ähm... Also ich fürchte dafür ist der Overhead größer als bei einfachem Polling. :mrgreen: In gewisser Weise sicher eine elegante Lösung, aber in diesem einfachen Fall ist doch eher das KISS-Prinzip vorzuziehen.

Hier wird bestimmt wieder so ein Thread draus, bei dem jeder die Möglichkeit
mit möglichst größten Overhead für einen Datumswechsel-Callback postet. :stupid:

Liebe Grüße,
Valle

Jens Hartmann 10. Mär 2010 21:26

Re: Auf Datumswechsel reagieren
 
Also, ich weiß ja nicht,
aber ich brauche auch so eine Funktion. Ich versende zu einer vordefinierten Uhrzeit in einem vordefinierten Interval (z.B. täglich, nur Montags und Freitags etc.) je nach Anforderung eine Report E-Mail. Das ganze habe ich mit einem Timer aufgebaut und es funktioniert ohne Probleme.

Gruß Jens


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:18 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