私は単純なPyGTKアプリケーションを持っています。私はいくつかのデータを取得し、GUIをリフレッシュするために、複数の定期的なタスクを実行する必要があるので、私はこのようなスレッドを拡張:オンデマンドトリガー付きの定期的なPythonスレッド
class MyThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.setDaemon(True)
self.event = threading.Event()
self.event.set()
def run(self):
while self.event.is_set():
timer = threading.Timer(60, self._run)
timer.start()
timer.join()
def cancel(self):
self.event.clear()
def _run(self):
gtk.threads_enter()
# do what need to be done, fetch data, update GUI
gtk.threads_leave()
私はいくつかのリストに保存し、アプリケーションのブートストラップにスレッドを開始し、終了前にそれらをキャンセルします。これは完璧に機能します。
しかし、現在実行中でない場合は、スレッドの1つを即時に実行させ、実行するまでの時間を待機させないようにするリフレッシュボタンを追加します。
bool varをMyThreadに追加して、スレッドが実行中であるかどうかを示し、実行時にリセットされたMyThread._run()を呼び出すだけです私のアプリが応答しなくなり、実行を決して完了しない_runタスク。
なぜこのようなことが起こるのかわかりません。この問題を解決する最良の方法は何ですか?バックグラウンドでリフレッシュを実行すると、GUIをブロックしないようにすることもできます。
実行を呼び出して秒数を1にするとタイマーが早くトリガできるようになるのでしょうか?
ありがとう!それはまさに私が探していたものです。 – umpirsky