Seite 1 von 1

eine Art Watchdog mit Timer Object

Verfasst: Dienstag 20. März 2018, 12:13
von SSSleepy
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

Re: eine Art Watchdog mit Timer Object

Verfasst: Dienstag 20. März 2018, 12:52
von Sirius3
@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)

Re: eine Art Watchdog mit Timer Object

Verfasst: Dienstag 20. März 2018, 13:32
von SSSleepy
Vielen Dank,

das muss ich jetzt erst einmal verstehen. :roll: