2012-08-22 15 views
5

ユーザーの入力を待つスレッドを生成する方法を実現しようとしています。入力が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] 

は行くための最良の方法(Related Link)ではありませんが、私はあなたのケースドン」にraw_input

答えて

3

を使用することができ満足していない場合は、時間のユーザ入力に方法がないように見えます。 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 
1

で待機している新しいスレッドを中断する方法がわかりませんスレッドを突然閉じるのを心配しないでください。リンクでは、

これは一般に、スレッドを突然、Pythonや任意の言語で殺すのに悪いパターンです。以下の例を考える:

  • スレッドが適切に閉じなければならない重要なリソースを保持しています。
  • このスレッドはいくつかの他のスレッドも作成しており、それらもまた強制終了する必要があります。

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

このソリューションは、あなたがHow to set time limit on input

関連する問題