0

この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は何かを実行しますが、タイマーを再度呼び出したいのですが、タイマーが終了した後でのみ呼び出します。これについての助けに本当に感謝しています。それが悪い習慣であることを理解せずにコードをコピーすることは知っていますが、リセットしない限り、単純なリセット可能なタイマーが関数を繰り返し呼び出すことを本当に望んでいました。

4

1 に答える 1

1

run関数を次のように変更します。

def run(self):
    while not self.finished.isSet():
        print "Time: %s - timer running..." % time.asctime()

        self.resetted = True
        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)
    print "Time: %s - timer finished!" % time.asctime()

これにより、が設定されるまで無期限に実行finishedされます。

于 2013-03-27T15:16:00.333 に答える