0

コードを見てみましょう。タイマーが終了したら、while ループを停止しようとしています。それを行う方法はありますか?

from threading import Timer

def run(timeout=30, runs):
    timer(timeout)
    while runs > 0 or over():
        #Do something
        print "start looping"

def timer(time):
    t = Timer(time, over)
    print "timer started"
    t.start()

def over():
    print "returned false"
    return False

ご覧のとおり、この関数を使用しover()て while ループを停止しようとしています。現在、時間が止まると over が false として返されますが、while ループには影響しません。私は何か間違ったことをしているに違いない。

オブジェクトでできることTimerは、関数 param を渡して、タイマーが終了したときにその関数を呼び出すことですover()。return のようover()False、リアルタイムで while ループに直接影響を与えることはありません。暗黙的whileに false にするためにコールバックが必要ですか、それとも私の停止方法が完全に間違っていて機能しませんか。

4

1 に答える 1

0

変更点

  • タイマーが切れたら、overが呼び出されたときに が返されるように状態を変更する必要がありますTrue。現時点では、簡単にするためにグローバル状態のままにしています。ある時点でこれを変更する必要があります。
  • また、while ループ条件に論理エラーがありました。まだ実行があり、終わっていないことを確認する必要があります。

#!/usr/bin/env python

from threading import Timer

globalIsOver = False

def run(runs, timeout=30):
    timer(timeout)
    while runs > 0 and not over():
        #Do something
        print "start looping"
    print 'Exited run function.'

def timer(time):
    t = Timer(time, setOver)
    print "timer started"
    t.start()

def setOver():
    global globalIsOver
    print '\nSetting globalIsOver = True'
    globalIsOver = True

def over():
    global globalIsOver
    print 'returned = ' + str(globalIsOver)
    return globalIsOver

run(100000000, timeout=2)

これは、2 秒が経過した後に次を返します。

...
start looping
returned = False
start looping
returned = False
start looping
returned = False
Setting globalIsOver = True

start looping
returned = True
Exited run function.
于 2013-09-23T00:18:41.197 に答える