6

ユーザー入力を待機するスレッドを生成する方法を達成しようとしています。10 秒以内に入力がない場合は、スクリプトで生成されたスレッドを強制終了し、処理を続行します。テキストが入力された場合にスレッドから入力を取り戻す方法はありますが、新しく生成されたスレッドをタイムアウトで強制終了させる方法はありません。

以下の例は、私が最も近いものです。新しく作成されたスレッドに、それがデーモンであり、メイン スクリプトが終了すると終了することを伝えます。これに関する問題は、スクリプトが終了するか、ユーザーが何かを入力するまで、スレッドが待機し続けることです。

shared_var = ['1']
def run(ref):
    ref[0] = raw_input("enter something: ")
    print "shared var changed to '%s'" % (ref[0])

thread = threading.Thread(target=run, args=(shared_var,))
thread.daemon = True  
thread.start()
time.sleep(10)  # simplified timeout

#Need some way to stop thread if no input has been entered
print "shared var = " + shared_var[0]

スレッドを突然強制終了するのが最善の方法ではないことはわかっていますが (関連リンク)、raw_input で待機している新しいスレッドを中断する方法がわかりません。

4

2 に答える 2

6

ユーザー入力の時間を計る方法がないようです。SmartElectron が提供するリンクでは、 raw_input が要求されるとタイマーが停止するため、ソリューションは機能しません。

これまでの最善の解決策は次のとおりです。

# Declare a mutable object so that it can be pass via reference
user_input = [None]

# spawn a new thread to wait for input 
def get_user_input(user_input_ref):
    user_input_ref[0] = raw_input("Give me some Information: ")

mythread = threading.Thread(target=get_user_input, args=(user_input,))
mythread.daemon = True
mythread.start()

for increment in range(1, 10):
    time.sleep(1)
    if user_input[0] is not None:
        break
于 2012-08-24T16:36:51.880 に答える
1

あなたの場合、スレッドを突然閉じることを心配しないでください。リンクで、言う

Python やどの言語でも、スレッドを突然強制終了するのは一般的に悪いパターンです。次のケースを考えてください。

  • スレッドは、適切に閉じる必要がある重要なリソースを保持しています。
  • スレッドは、同様に強制終了する必要がある他のいくつかのスレッドを作成しました。

データベース接続、開いているファイルなどを適切に閉じる必要があるリソースを閉じます。この場合、スレッドを適切に閉じることが基本です。この場合、ソリューションは有効です。*

この解決策が満たされない場合は、入力に制限時間を設定する方法を使用できます

于 2012-08-22T18:33:42.777 に答える