このWebアドレスhttp://code.activestate.com/recipes/577407-resettable-timer-class-a-little-enhancement-from-p/からコードをコピーしました
リセット可能なタイマーを作成すると、うまく機能しますが、終了すると終了します。もう一度やり直したいのですが、初めてでどうしたらいいのかわからなかったです。
次の行の後、run()関数の下部にそれ自体の新しいインスタンスを作成するのに疲れました。
print "Time: %s - timer finished!" % time.asctime()
しかし、Pythonはそれを気に入らなかったようです。
Eddy Jacobによって作成されたコピー貼り付けコードは次のとおりです:
from threading import Thread, Event, Timer
import time
def TimerReset(*args, **kwargs):
""" Global function for Timer """
return _TimerReset(*args, **kwargs)
class _TimerReset(Thread):
"""Call a function after a specified number of seconds:
t = TimerReset(30.0, f, args=[], kwargs={})
t.start()
t.cancel() # stop the timer's action if it's still waiting
"""
def __init__(self, interval, function, args=[], kwargs={}):
Thread.__init__(self)
self.interval = interval
self.function = function
self.args = args
self.kwargs = kwargs
self.finished = Event()
self.resetted = True
def cancel(self):
"""Stop the timer if it hasn't finished yet"""
self.finished.set()
def run(self):
print "Time: %s - timer running..." % time.asctime()
while self.resetted:
print "Time: %s - timer waiting for timeout in %.2f..." % (time.asctime(), self.interval)
self.resetted = False
self.finished.wait(self.interval)
if not self.finished.isSet():
self.function(*self.args, **self.kwargs)
self.finished.set()
print "Time: %s - timer finished!" % time.asctime()
def reset(self, interval=None):
""" Reset the timer """
if interval:
print "Time: %s - timer resetting to %.2f..." % (time.asctime(), interval)
self.interval = interval
else:
print "Time: %s - timer resetting..." % time.asctime()
self.resetted = True
self.finished.set()
self.finished.clear()
私は次を使用してタイマーを実行しました:
tim = TimerReset(10, AddBlank)
tim.start()
関数AddBlankは何かを実行しますが、タイマーを再度呼び出したいのですが、タイマーが終了した後でのみ呼び出します。これについての助けに本当に感謝しています。それが悪い習慣であることを理解せずにコードをコピーすることは知っていますが、リセットしない限り、単純なリセット可能なタイマーが関数を繰り返し呼び出すことを本当に望んでいました。