Problem mit einem Timer in einer Rule

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
udo1toni
Beiträge: 15265
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Problem mit einem Timer in einer Rule

Beitrag von udo1toni »

Der Timer "läuft" ja nicht, createTimer() trägt nur einen Termin im Scheduler ein.
Der Scheduler startet den übergebenen Code zum gewünschten Zeitpunkt und behält den Eintrag bis zum Rücksprung im Speicher.
Wenn zu dem Zeitpunkt bereits ein reschedule() erfolgt ist, wird der Ausführungszeitpunkt entsprechend verschoben.
Während der Code bereits ausgeführt wird, darf ein cancel keinen Einfluss mehr haben, denn ein ungeordneter Abbruch des Codes kann potentiell erheblichen Schaden anrichten. Das cancel darf auch nicht dazu führen, dass der Timer aus dem Scheduler gelöscht wird. Da der Code schon läuft, muss der Handle erhalten bleiben, der Scheduler wartet ja auf den Rücksprung.
Anders sieht es aus, wenn der Code noch nicht ausgeführt wird, dann kann nichts passieren, der Termin wird sofort gelöscht.

Wenn der Code ausgeführt wird, braucht es keinen weiteren Befehl zum Löschen, denn der Scheduler löscht den Termin, sobald der Rücksprung erfolgt ist. Wenn der Code sich selbst abbrechen möchte, geht das natürlich über return; oder alternativ mit dem bedingten Überspringen des Codes, so wie man das auch in einer normalen Rule machen würde.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

violine21
Beiträge: 600
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Problem mit einem Timer in einer Rule

Beitrag von violine21 »

Danke Dir Udo!
Ich habe es jetzt verstanden.
Eine Kleinigkeit noch ;) Sorry, wenn ich nerve. Ich will mir nur nichts Falsches anlernen.
Mit

Code: Alles auswählen

myTimer.cancel
lösche ich den Timer.
Mit

Code: Alles auswählen

myTimer = null
scheinbar auch.
Was ist dabei der Unterschied?

VG André

Benutzeravatar
udo1toni
Beiträge: 15265
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Problem mit einem Timer in einer Rule

Beitrag von udo1toni »

Mit myTimer.cancel löschst Du den Timer. Das heißt, der Code wird zur geplanten Zeit nicht mehr ausgeführt.
Mit myTimer = null löschst Du den Handle auf den Timer. Der Timer ist aber immer noch vorhanden und der Code wird zum geplanten Zeitpunkt ausgeführt. Da Du aber keinen Handle mehr hast, hast Du keinerlei Kontrolle mehr, weder kannst Du prüfen, ob der Timer noch vorhanden ist, noch kannst Du die Ausführung verhindern. myTimer = null sollte man also nur an zwei Stellen im Code verwenden, 1. wenn man vorher mit myTimer.cancel den Timer gelöscht hat, 2. wenn man innerhalb des geplanten Codes (gewöhnlich zum Abschluss) aufräumt, um außerhalb des Codeblocks die Prüfung auf null zu ermöglichen.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

violine21
Beiträge: 600
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Problem mit einem Timer in einer Rule

Beitrag von violine21 »

Udo, jetzt weiss ich Bescheid und viele Dinge werden klarer!

Ich danke Dir vielmals!

Antworten