2

CLIを介して(監視用に)制御できるGUIプログラムがあります。CLIは、raw_inputを使用してwhileループで実装されます。GUIの閉じるボタンを使用してプログラムを終了すると、raw_inputでハングし、入力を取得するまで終了しません。

入力を入力せずにraw_inputをすぐに中止するにはどうすればよいですか?

WinXPで実行していますが、プラットフォームに依存しないようにしたいのですが、開発者ツールであるため、Eclipse内でも機能するはずです。Pythonのバージョンは2.6です。

私は何時間もstackoverflowを検索し、そのトピックに対する多くの答えがあることを知っていますが、ノンブロッキングCLIリーダーを持つためのプラットフォームに依存しないソリューションは本当にありませんか?

そうでない場合、この問題を克服するための最良の方法は何でしょうか?

ありがとう

4

2 に答える 2

2

それはおそらく最善の解決策ではありませんが、関数を持つスレッドモジュールthread.interrupt_main()を使用できます。したがって、2 つのスレッドを実行できます。1 つは raw_input メソッドを使用し、もう 1 つは割り込み信号を出すことができます。上位レベルのスレッドが KeyboardInterrupt 例外を発生させます。

import thread
import time

def main():
    try:
        m = thread.start_new_thread(killable_input, tuple())
        while 1:
            time.sleep(0.1) 
    except KeyboardInterrupt:
        print "exception" 

def killable_input():
    w = thread.start_new_thread(normal_input, tuple())
    i = thread.start_new_thread(wait_sometime, tuple())


def normal_input():
    s = raw_input("input:")


def wait_sometime():
    time.sleep(4) # or any other condition to kill the thread
    print "too slow, killing imput"
    thread.interrupt_main()

if __name__ == '__main__':
    main()
于 2011-01-04T12:52:35.263 に答える
1

使用している GUI ツールキットに応じて、イベント リスナーをウィンドウを閉じるアクションに接続し、 を呼び出す方法を見つけてくださいwin32api.TerminateProcess(-1, 0)

参考までに、Linux では呼び出しがsys.exit()機能します。

于 2011-01-04T09:00:03.427 に答える