外部プログラムを操作し、タイムアウト スレッドを開始する python プログラムがあります。タイムアウト スレッドは 10 分間カウントダウンする必要があり、外部プログラムを操作するスクリプトがその時間内に終了しない場合は、外部プログラムを強制終了する必要があります。
私のスレッドは一見問題なく動作しているように見えます。メイン スクリプトとスレッドは問題なく同時に実行されます。しかし、外部プログラムにポップアップウィンドウが表示されると、スクリプトが停止するため、カウントダウンスレッドでさえカウントが停止するため、仕事が完全に失敗します。
問題は、スクリプトが外部プログラムの API でブロック関数を呼び出し、ポップアップ ウィンドウによってブロックされていることだと思います。メイン プログラムがブロックされる理由は理解できますが、カウントダウン スレッドがブロックされる理由はわかりません。したがって、考えられる解決策の 1 つは、カウントダウン用に別のスクリプトを実行することです。
手がかりを求めてあちこち探しましたが、あまり見つかりませんでした。ここにgevent ライブラリへの参照がありました: background function in Python です が、これは基本的なタスクのように思われるため、このために外部ライブラリを含めたくありません。
Windows マルチメディア タイマーhereを使用するソリューションも見つけましたが、これまでこれを使用したことがなく、コードがこれに柔軟に対応できないのではないかと心配しています。スクリプトは Windows 専用ですが、XP 以降のすべての Windows で動作するはずです。
Unix では signal.alarm を見つけましたが、これはまさに私がやりたいことを実行しているように見えますが、Windows では利用できません。これに代わるものはありますか?
最も単純な方法でこれを操作する方法についてのアイデアはありますか?
これは私が作成している簡略化されたスレッドです (問題を再現するために IDLE で実行します):
import threading
import time
class timeToKill():
def __init__(self, minutesBeforeTimeout):
self.stop = threading.Event()
self.countdownFrom = minutesBeforeTimeout * 60
def startCountdown(self):
self.countdownThread= threading.Thread(target=self.countdown, args=(self.countdownFrom,))
self.countdownThread.start()
def stopCountdown(self):
self.stop.set()
self.countdownThread.join()
def countdown(self,seconds):
for second in range(seconds):
if(self.stop.is_set()):
break
else:
print (second)
time.sleep(1)
timeout = timeToKill(1)
timeout.startCountdown()
raw_input("Blocking call, waiting for input:\n")