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.
Problem mit einem Timer in einer Rule
- udo1toni
- Beiträge: 15265
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Problem mit einem Timer in einer Rule
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet
-
- Beiträge: 600
- Registriert: 20. Sep 2019 05:49
Re: Problem mit einem Timer in einer Rule
Danke Dir Udo!
Ich habe es jetzt verstanden.
Eine Kleinigkeit noch
Sorry, wenn ich nerve. Ich will mir nur nichts Falsches anlernen.
Mit lösche ich den Timer.
Mit scheinbar auch.
Was ist dabei der Unterschied?
VG André
Ich habe es jetzt verstanden.
Eine Kleinigkeit noch

Mit
Code: Alles auswählen
myTimer.cancel
Mit
Code: Alles auswählen
myTimer = null
Was ist dabei der Unterschied?
VG André
- udo1toni
- Beiträge: 15265
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Problem mit einem Timer in einer Rule
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.
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
-
- Beiträge: 600
- Registriert: 20. Sep 2019 05:49
Re: Problem mit einem Timer in einer Rule
Udo, jetzt weiss ich Bescheid und viele Dinge werden klarer!
Ich danke Dir vielmals!
Ich danke Dir vielmals!