43

特定の時間までカウントダウンするメソッドを作成しようとしていますが、再起動コマンドが指定されていない限り、タスクを実行します。threading.Timerしかし、Pythonクラスではタイマーをキャンセル可能にすることはできないと思います。

import threading

def countdown(action):
    def printText():
        print 'hello!'

    t = threading.Timer(5.0, printText)
    if (action == 'reset'):
        t.cancel()

    t.start()

上記のコードがどういうわけか間違っていることは知っています。ここで親切なガイダンスをいただければ幸いです。

4

5 に答える 5

39

タイマーを開始した後、cancel メソッドを呼び出します。

import time
import threading

def hello():
    print "hello, world"
    time.sleep(2)

t = threading.Timer(3.0, hello)
t.start()
var = 'something'
if var == 'something':
    t.cancel()

Timerを使用する代わりに、 Threadでwhile ループを使用することを検討してください。別の質問に対する Nikolaus Gradwohl の回答から引用した例を次に示します。

import threading
import time

class TimerClass(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.event = threading.Event()
        self.count = 10

    def run(self):
        while self.count > 0 and not self.event.is_set():
            print self.count
            self.count -= 1
            self.event.wait(1)

    def stop(self):
        self.event.set()

tmr = TimerClass()
tmr.start()

time.sleep(3)

tmr.stop()
于 2012-03-21T21:02:04.700 に答える
16

正しく理解しているかどうかはわかりません。この例のように書きたいですか?

>>> import threading
>>> t = None
>>> 
>>> def sayHello():
...     global t
...     print "Hello!"
...     t = threading.Timer(0.5, sayHello)
...     t.start()
... 
>>> sayHello()
Hello!
Hello!
Hello!
Hello!
Hello!
>>> t.cancel()
>>>
于 2012-03-21T21:01:43.997 に答える
8

threading.Timerクラスにはメソッドがあり、スレッドをキャンセルしませんがタイマーが実際に起動するのを停止します。実際に何が起こるかというと、メソッドが を設定し、実際に を実行しているスレッドは、待機が完了した後、実際にコールバックを実行する前に、そのイベントをチェックします。cancelcancelthreading.Eventthreading.Timer

とはいえ、タイマーは通常、それぞれに個別のスレッドを使用せずに実装されます。これを行う最善の方法は、プログラムが実際に何を行っているか (このタイマーを待機している間) によって異なりますが、GUI やネットワーク フレームワークなど、イベント ループを持つものにはすべて、イベント ループにフックされたタイマーを要求する方法があります。

于 2012-03-21T21:02:26.070 に答える