Zeitgesteuerte Aktionen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
DL3AD
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

Beitrag von DL3AD »

Hallo,
wie erstellt man eine Zeitgesteuerte Aktion - wie z.b. täglich um 19:00 Uhr => mach was.

Frank

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Zeitgesteuerte Aktionen

Beitrag von fliegermichl »

Unter Linux crontab -e

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Zeitgesteuerte Aktionen

Beitrag von six1 »

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...
Gruß, Michael

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Zeitgesteuerte Aktionen

Beitrag von theo »

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

DL3AD
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

Beitrag von DL3AD »

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

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Zeitgesteuerte Aktionen

Beitrag von theo »

Die Idee von six1 ist schon gut.
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;  
https://www.freepascal.org/docs-html/rt ... tines.html

DL3AD
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

Beitrag von DL3AD »

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

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Zeitgesteuerte Aktionen

Beitrag von theo »

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

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Zeitgesteuerte Aktionen

Beitrag von six1 »

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 :D
Du benötigst eine Struktur in dieser Art

Code: Alles auswählen

type
  TAction=Record
    EventTime:TTime;
    Fired:boolean;
  end;
TActionList:array of TAction;
Definiere eine private Variable in der Form: ActionList:TActionList;

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

DL3AD
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

Beitrag von DL3AD »

... ich danke euch!
Dass hilft mir weiter.

Gruß Frank

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Zeitgesteuerte Aktionen

Beitrag von six1 »

Das Zurücksetzen solltest du in dieser Art lösen:

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;
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...
Gruß, Michael

NoCee
Beiträge: 170
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

Beitrag von NoCee »

Im Prinzip hab ich das ähnlich gemacht.

Code: Alles auswählen

//setzen 
 if (frac(now) >= Dateiwechselzeit) and (not Dateigewechselt) then machwas;    
//zurücksetzen
if frac(now) < Dateiwechselzeit then Dateigewechselt:= false;  
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

Antworten