Zeitgesteuerte Aktionen
-
- Beiträge: 478
- Registriert: Fr 13. Sep 2013, 12:07
- OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
- CPU-Target: 64Bit
- Wohnort: Rügen
Zeitgesteuerte Aktionen
Hallo,
wie erstellt man eine Zeitgesteuerte Aktion - wie z.b. täglich um 19:00 Uhr => mach was.
Frank
wie erstellt man eine Zeitgesteuerte Aktion - wie z.b. täglich um 19:00 Uhr => mach was.
Frank
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1647
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Zeitgesteuerte Aktionen
Unter Linux crontab -e
Re: Zeitgesteuerte Aktionen
Man könnte ein Array mit Zeiten in TTime erstellen.
Mit einer Timer Komponente zyklisch auf jeden Array Eintrag prüfen, ob die Array Zeit kleiner als Time ist.
Im Array sollte noch ein Flag für "Fired" sein, damit die Aktion nur einmalig ausgelöst wird.
Dieses Flag um 00:00:00 Uhr im Array zurücksetzen.
Mal so grob dahin gedacht...
Mit einer Timer Komponente zyklisch auf jeden Array Eintrag prüfen, ob die Array Zeit kleiner als Time ist.
Im Array sollte noch ein Flag für "Fired" sein, damit die Aktion nur einmalig ausgelöst wird.
Dieses Flag um 00:00:00 Uhr im Array zurücksetzen.
Mal so grob dahin gedacht...
Gruß, Michael
Re: Zeitgesteuerte Aktionen
Ich finde die Frage ist zu einfach gestellt, da müsste man mehr wissen.
- Wie genau muss das sein?
- Auf was für einem Computer/BS läuft das?
- Läuft der 24/7? Spielt Stromverbrauch eine Rolle?
- Muss der Computer vom Standby aufgeweckt werden?
- Muss etwas im Bereich des Betriebssystems gesteuert werden oder ein externes Gerät?
- Wäre vielleicht ein Raspi oder gar ein ESP32 o.ä. geeigneter?
- Inwiefern hat das überhaupt mit Lazarus zu tun? Würde Crontab nicht reichen?
- etc...
- Wie genau muss das sein?
- Auf was für einem Computer/BS läuft das?
- Läuft der 24/7? Spielt Stromverbrauch eine Rolle?
- Muss der Computer vom Standby aufgeweckt werden?
- Muss etwas im Bereich des Betriebssystems gesteuert werden oder ein externes Gerät?
- Wäre vielleicht ein Raspi oder gar ein ESP32 o.ä. geeigneter?
- Inwiefern hat das überhaupt mit Lazarus zu tun? Würde Crontab nicht reichen?
- etc...
-
- Beiträge: 478
- Registriert: Fr 13. Sep 2013, 12:07
- OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
- CPU-Target: 64Bit
- Wohnort: Rügen
Re: Zeitgesteuerte Aktionen
... das ganze soll auf einem Raspi4 laufen - Debian OS
Zu bestimmten Zeiten soll eine Datei - die vorher geschlossen werden muss - auf ein NAS kopiert werden.
Zu bestimmten Zeiten werden Daten zu LoRa Nodes übertragen
Zu bestimmten Zeiten...
Genauigkeit 1 Minute
Das alles aus einer Anwendung heraus
Zu bestimmten Zeiten soll eine Datei - die vorher geschlossen werden muss - auf ein NAS kopiert werden.
Zu bestimmten Zeiten werden Daten zu LoRa Nodes übertragen
Zu bestimmten Zeiten...
Genauigkeit 1 Minute
Das alles aus einer Anwendung heraus
Re: Zeitgesteuerte Aktionen
Die Idee von six1 ist schon gut.
Was ist genau deine Frage?
Wie man die Zeit vergleicht?
https://www.freepascal.org/docs-html/rt ... tines.html
Was ist genau deine Frage?
Wie man die Zeit vergleicht?
Code: Alles auswählen
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Time>StrToTime('10:43:00') then Action;
end;
-
- Beiträge: 478
- Registriert: Fr 13. Sep 2013, 12:07
- OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
- CPU-Target: 64Bit
- Wohnort: Rügen
Re: Zeitgesteuerte Aktionen
... die Frage ist wie ich so eine Zeitgesteuerte Aktion auslöse
In etwa so wie ein Timer, bloß dass hier zu einer zu definierenden Uhrzeit ein Ereigniss gefeuert wird auf dass reagieren kann.
In etwa so wie ein Timer, bloß dass hier zu einer zu definierenden Uhrzeit ein Ereigniss gefeuert wird auf dass reagieren kann.
Re: Zeitgesteuerte Aktionen
Ja, das macht ja das Beispiel in meinem letzten Beitrag. Du benutzt einen Timer um die Zeit abzufragen (oder handelt es sich um ein Konsolenprogramm?)DL3AD hat geschrieben: Mi 3. Feb 2021, 11:56 ... die Frage ist wie ich so eine Zeitgesteuerte Aktion auslöse
In etwa so wie ein Timer, bloß dass hier zu einer zu definierenden Uhrzeit ein Ereigniss gefeuert wird auf dass reagieren kann.
Du musst natürlich noch sicherstellen, dass es nur einmal ausgelöst wird, wie six1 beschrieben hat.
Ein Array/Liste wäre auch gut, aber das kannst du doch selber?
Re: Zeitgesteuerte Aktionen
Ich habe Dir mal ein paar Schnipsel hingeschrieben... ist ungeprüft, aber damit du mal die Einzelheiten zu diesem Lösungsansatz siehst...
Ein "klitzekleines" Problemchen ist das Zurücksetzen von "Fired" nach Mitternacht... da musst du dir noch Gedanken machen
Du benötigst eine Struktur in dieser Art
Definiere eine private Variable in der Form: ActionList:TActionList;
Nach dem Start deines Programmes fügst du Einträge hinzu:
Dann benötigst du einen Timer. Den Timerintervall auf gewünschte Zeit einstellen (in Millisekunden). In diesem Intervall wird geprüft.
Ein "klitzekleines" Problemchen ist das Zurücksetzen von "Fired" nach Mitternacht... da musst du dir noch Gedanken machen

Du benötigst eine Struktur in dieser Art
Code: Alles auswählen
type
TAction=Record
EventTime:TTime;
Fired:boolean;
end;
TActionList:array of TAction;
Nach dem Start deines Programmes fügst du Einträge hinzu:
Code: Alles auswählen
// Deklaration in Form1 nicht vergessen!
Procedure TForm1.Add_ActionList_Event(ActionTime:TTime);
begin
setlength(ActionList, high(ActionList)+2);
ActionList[ high(ActionList)].EventTime:=ActionTime;
ActionList[ high(ActionList)].Fired:=false;
end;
Code: Alles auswählen
//Aufruf von Add_ActionList_Event
Add_ActionList_Event( StrToTime('10:43:00'));
Dann benötigst du einen Timer. Den Timerintervall auf gewünschte Zeit einstellen (in Millisekunden). In diesem Intervall wird geprüft.
Code: Alles auswählen
procedure TForm1.Timer1Timer(Sender: TObject);
var
x:integer;
begin
for x := 0 to high(ActionList) do
begin
// auf jeden Fall bei 00:00:00 "Fired" zurücksetzen, damit Ereignis am neuen Tag wieder funktioniert
if (Time > StrToTime('00:00:00')) then
begin
ActionList[x].fired:=false;
end;
if (ActionList[x].fired=false)and(Time > ActionList[x].EventTime) then
begin
// mach irgendwas... löse Ereignis aus
ActionList[x].fired:=true;
end;
end;
end;
Gruß, Michael
-
- Beiträge: 478
- Registriert: Fr 13. Sep 2013, 12:07
- OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
- CPU-Target: 64Bit
- Wohnort: Rügen
Re: Zeitgesteuerte Aktionen
... ich danke euch!
Dass hilft mir weiter.
Gruß Frank
Dass hilft mir weiter.
Gruß Frank
Re: Zeitgesteuerte Aktionen
Das Zurücksetzen solltest du in dieser Art lösen:
Ein Problem dabei ist der Timer Intervall! Es könnte bei ungünstiger Konfiguration dazu führen, dass die "Fired" Einträge nicht zurück gesetzt werden...
Code: Alles auswählen
// auf jeden Fall bei 00:00:00 "Fired" zurücksetzen, damit Ereignis am neuen Tag wieder funktioniert
if (Time > StrToTime('23:59:00')) then
begin
ActionList[x].fired:=false;
end;
Gruß, Michael
-
- Beiträge: 174
- Registriert: Do 3. Mär 2011, 21:34
- OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
- CPU-Target: Intel 32/64Bit, ARM9
- Wohnort: Ulm
Re: Zeitgesteuerte Aktionen
Im Prinzip hab ich das ähnlich gemacht.
die Dateiwechselzeit steht in einem INI-File
Das zurücksetzen hab ich nicht genau um eine bestimmte Uhrzeit gemacht
weil ich nicht weiß wann ich was ausführen will. Abgefragt wird das in einem
Minutentimer der sowieso immer laufen muß.
Das funzt seit Jahren problemlos mit allen möglichen Konfigurationen
Gruß
NoCee
Code: Alles auswählen
//setzen
if (frac(now) >= Dateiwechselzeit) and (not Dateigewechselt) then machwas;
//zurücksetzen
if frac(now) < Dateiwechselzeit then Dateigewechselt:= false;
Das zurücksetzen hab ich nicht genau um eine bestimmte Uhrzeit gemacht
weil ich nicht weiß wann ich was ausführen will. Abgefragt wird das in einem
Minutentimer der sowieso immer laufen muß.
Das funzt seit Jahren problemlos mit allen möglichen Konfigurationen
Gruß
NoCee