1 from libtuer import ThreadRepeater
2 from collections import namedtuple
6 ToBeWoken = namedtuple('ToBeWoken','f period time_since_call one_shot')
9 def __init__(self, sm):
11 self._t = ThreadRepeater(self._wake, SLEEP_TIME, name="Waker")
14 def register(f, time, one_shot = False):
15 '''Register a function which is called approximately every <time> seconds (or just once, if one_shot is True). f should return quickly, or it will delay the waker!'''
16 time = max(time//SLEEP_TIME, 1)
17 self._tobewokens.append(ToBeWoken(f, time, 0, one_shot))
21 # run the functions we ought to run
22 for tobewoken, idx in zip(self._tobewokens, range(len(self._tobewokens))):
23 tobewoken.time_since_call += 1
24 if tobewoken.time_since_call >= tobewoken.period:
26 tobewoken.time_since_call = 0
27 if tobewoken.one_shot:
29 # delete what we have to delete - in reverse order so the indices stay valid!
32 del self._tobewokens[idx]