eine Art Watchdog mit Timer Object

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
SSSleepy
User
Beiträge: 2
Registriert: Dienstag 20. März 2018, 12:00

Hallo,

ich beiße mir gerade die Zähne an einer "retriggerbaren" Timer-Funktion aus. Ich möchte eine Timer-Funktion starten und diese immer wieder zurücksetzen, sofern func() regelmäßig aufgerufen wird. Das ganze stelle ich mir in etwa so vor:

Code: Alles auswählen

    
def timeout_supply(): 
    print(....)
    
def func()
    t_supply.cancel()
    t_supply = Timer(5, timeout_supply)
    t_supply.start()   
In meinem Beispiel bekomme ich aber eine Fehlermeldung wenn ich t_supply.cancel() aufrufe während der Timer noch nicht, oder noch nicht wieder initialisiert ist. Gibt es eine Möglichkeit die aktiven Timer Threads abzufragen? Dann könnte ich t_supply.cancel() nur bei aktivem Timer aufrufen.

Wäre cool, wenn von euch jemand einen Tipp für mich hätte :-)

Viele Grüße
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@SSSleepy: statt einen Timer dafür zu mißbrauchen, schreibst Du Dir am besten eine passende Klasse selbst:

Code: Alles auswählen

class Timeout(Thread):
    """Call a function after a specified number of seconds:

            t = Timer(30.0, f, args=[], kwargs={})
            t.start()
            t.restart()
    """

    def __init__(self, interval, function, args=[], kwargs={}):
        Thread.__init__(self)
        self.interval = interval
        self.function = function
        self.args = args
        self.kwargs = kwargs
        self._restart = Event()

    def restart(self, interval=None):
        """Restart the timer if it hasn't finished yet"""
        if interval is not None:
            self.interval = interval
        self._restart.set()

    def run(self):
        while True:
            self._restart.wait(self.interval)
            if not self._restart.is_set():
                break
            self._restart.clear()
        self.function(*self.args, **self.kwargs)
SSSleepy
User
Beiträge: 2
Registriert: Dienstag 20. März 2018, 12:00

Vielen Dank,

das muss ich jetzt erst einmal verstehen. :roll:
Antworten