Umfangreiche Datum- und Zeitberechnungen
-
Hi,
möchte einen Art Taskplaner bauen, der zu bestimmten Zeitpunkten bestimmte Funktionen aufruft.
Die GUI habe ich schon fertig... jetzt fehlt "nur" noch die Berechnung
Hier mal ein Entwurf davon
GUI
Die Funktion soll ein TDateTime Objekt (i.d.R. Now()) bekommen und auch wieder eins zurückgeben.
Wie würdet ihr da am besten vorgehen?
Und: Wie kann ich das Datum aus einem TDateTimePicker und die Zeit aus einem anderen Picker zu einem TDateTime zusammenführen?
Danke schonmal
-
Warum benutzt du nicht einfach den Windows-Taskplaner?
-
Mmmh also einmal kann ich da kein Sekunden-Intervall einstellen und außerdem will ich nur so wenig wie möglich von M$ abhängig sein
Abgesehen davon kann ich doch da nur Programme starten lassen... Ich will aber bestimmte Funktionen in meinem eigenen Programm ausführen...
Bräuchte hier nur kurz Starthilfe
-
buddyman83 schrieb:
Sekunden-Intervall
Dafür gibt's Timer.
buddyman83 schrieb:
außerdem will ich nur so wenig wie möglich von M$ abhängig sein
Und das unter Windows? Paradox.
Wenn dein Programm plattformunabhängig sein soll, bist du im C++Builder-Forum eh falsch. (Es sei vielleicht denn, du hast die Mac-Portierung im Auge; die wird mit dem kommenden C++Builder XE2 möglich sein.)
buddyman83 schrieb:
Abgesehen davon kann ich doch da nur Programme starten lassen... Ich will aber bestimmte Funktionen in meinem eigenen Programm ausführen...
Dann bau eben Kommandozeilenparameter ein.
buddyman83 schrieb:
Bräuchte hier nur kurz Starthilfe
Worum geht es dir: willst du dein (noch zu beschreibendes) eigentliches Problem auf dem effizientesten Wege lösen? Oder willst du auf Biegen und Brechen den Taskplaner nachbauen?
-
Hallo Buddyman83
Ich hatte mich auch mal eine Weile damit auseinandergesetzt.
Leider kann ich dir den entsprechenden Code-Abschnitt nicht einfach so geben, da du höchstwahrscheinlich aufgrund anderer Datenstrukturen, sowieso nochmals alles komplett neu schreiben müsstest.
Aus diesem Grund hier ein paar Sachen, wie ich es gemacht hatte.
Oder besser gesagt, als Gedankenstütze.Datum + Zeit zusammenführen
Ich habe es damals über "StrToDateTime" gelöst//Gebietseinstellungen (Formatierungen) für DE-CH lesen TFormatSettings G_tfsDateFormat = TFormatSettings::Create(2055); //String entsprechend formatieren //Diesen String könntest du nun aus den Werten der Boxen zusammensetzen TDateTime complet = StrToDateTime("21.08.2011 03:01:00",tfsDateFormat);
Berechnungen
//Wenn du 1 zu TDateTime hinzuaddierst, kannst du den Tag um eins erhöhen //Monat und Jahr werden ebenfalls automatisch angepasst TFormatSettings G_tfsDateFormat = TFormatSettings::Create(2055); TDateTime complet = StrToDateTime("21.08.2011 03:01:00",tfsDateFormat); //Anschliessend ist folgendes gespeichert ("22.08.2011 03:01:00") complet += 1; //Wochentag ermitteln //Den Wochentag eines TDateTime kannst du wie folgt auslesen //Gibt 1 - 7 zurück (1 = Sonntag) short weekDay = complet.DayOfWeek();
Funktion zu berechnetem Zeitpunkt ausführen
Wenn du dieses TDateTime berechnet hast, kannst du wie folgt eine Aktion ausführenDu subtrahierst das Anfangsdatum vom erechnete Datum ab und erhältst so die Differenz in Tagen (gebrochene Zahl)
http://www.delphi-treff.de/tipps/object-pascal/datumswerte/differenz-zwischen-zwei-tdatetime-werten-ausgeben/Nice to Know (PC im Standby)
Falls du willst, dass deine Funktion auch ausgeführt wird, wenn dein PC im Standby-Modus,... ist, dann solltest du dir mal den WaitableTimer ansehen "CreateWaitableTimer()" und "SetWaitableTimer()" -> Damit kannst du den PC kurz wecken.
-> Hier könnt ich dir ein Codebeispiel geben.Monatlich,...
Ein weiterer wichtiger punkt, auch wenn er noch so banal scheint, ist die Thematik "Monatlich". [Vielleicht hast du dir darüber ja schon Gedanken gemacht].Folgendes:
Sagst du, er soll jeden fünften Freitag im Monat eine Aktion ausführen, so hasst du ein Problem wenn der Monat keinen fünften Freitag besitzt.
In den Berechnungen musst du nun darauf eingehen und diese möglichen Komplikationen eliminieren.
- Soll der Termin ausgelassen werden
- Soll er auf den letzten Tag des Monats verschoben werden
- Soll er auf den letzten entsprechenden Wochentag des Monats verschoben werden
- etc.Fazit
Mit der Möglichkeit, ein TDateTime-Objekt um x-Tage zu erhöhen und zurückzusetzen, sowie den Wochentag auszulesen, hasst du eigentlich alle Mittel, die du für die Berechnung brauchst.Nun brauchst du nurnoch Hirnschmalz und Zeit um einen geeigneten Algorithmus für dein Problem zu schreiben.
Ich hoffe, ich habe nicht am Wesentlichen vorbeigeschrieben und dass ich dir ein wenig helfen konnte.