Re: Problem mit einem Timer in einer Rule
Verfasst: 20. Apr 2020 05:37
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.
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.