2012-03-20 4 views
7

上signal.pause()と同等で、私は2つのスレッドを生成します私のメインアプリケーションスレッドを持っていると私はうまくそれらを終了するには、私のメインスレッドでSIGINTをキャッチ。 Linuxの場合、私はsignal.pause()を使用しており、完全に動作します。のPython:Windowsの

Windows上signal.pause()を実装するための最良の方法は何ですか?

my_queue.get(True, averylongtime) 

そして、私のシグナルハンドラでMY_QUEUEで何かを置く:

私の醜いソリューションです。タイムアウトを指定しないと、SIGINTは捕捉されないことに注意してください。しかし、もっと良い解決策があるのだろうかと思います。

は、私がこれを使用するあなたの

+0

どのようにSIGINTを生成していますか?キーボードの + Cの場合、KeyboardInterruptをトラップすることができます。それ以外の場合は、Win32イベントを発生させる場合があります。 – cdarke

答えて

0

ありがとう:

#another: 
while not self.quit: 
    # your code 

# main 
try: 
    # your code 
except KeyboardInterrupt: 
    another.quit = True 
    time.sleep(5) # or wait for threading.enumerate() or similar 

あまりにもバグの存在下で、私はそれがより堅牢たい場合は、たとえば、終了:

except KeyboardInterrupt: 
    another.quit = True 
    signal.alarm(5) 
    time.sleep(6) 

副作用これにされますexcept:またはexcept Exception, e:(これは何とかやるべきことではありません)のすべてのブロック、except KeyboardInterrupt: raiseの前にその例外が "eaten"されないようにする必要があります"

+0

あなたの答えの一部はWindows上で動作しません。 signal.alarmはWindowsでは利用できません –

+0

良いキャッチ@PhilippeOmbredanne –

+0

とFWIW @ qarma ...私はかなりsignal.alarmのようなものに興味がありますが、ウィンドウ –

0

これは、Windowsでctrl-cを捕まえるために使用します。私がパイプやファイルに書き込んでいる場合や、あなたが持っているものを..正常に終了したい。以下はおもちゃの例です

import signal 
import sys 

def signal_handler(signal, frame):  
    print('Process Interrupted!\n\a') 
    sys.exit(0) 

signal.signal(signal.SIGINT,signal_handler) 

#Rest of your code 
関連する問題