2012-01-18 29 views
0

標準のread-eval-printループを使用するプログラムでアラームを実装しようとしています。タイマー割り込みを待機プロセスにする方法は?

while True: 
    input = get_input() # A function that waits for input and 
         # returns the input once it is obtained 
    set_alarm(interpret(input)) # A function that sets the alarm 

Set_alarmがthreading.Timerクラスを使用しています。

コードの例は、このようなものになるだろう。しかし、これには1つの問題があります。タイマーは時間の経過とともにアクティブになりますが、get_input()が入力を待っているとき、タイマーはそのプロセスが完了してから必要な出力が得られるまで待機します。

タイマーのコールバック機能が、待機中の機能を中断し、起動後直ちに出力を生成する方法はありますか?

ありがとうございます!

答えて

0

CPython checks for signals個々の純粋なPythonのステップの間。 get_input()がグローバルインタプリタロックを所有しており、get_inputが返るまで信号処理が遅延する可能性があります。

解決策は、非ブロック呼び出しを使用してタイムアウトを考慮してユーザー入力を求めることです。お使いのプラットフォームによっては、kbhitを使用するか、(stdinを使用して)ユーザー入力を取得することができます。

+0

よろしくお願い致します。しかしkhbitはキーストロークの入力にのみ適用されます。 get_input()がスピーチなどの別のフォームの入力を取得するとどうなりますか? – Jian

+0

@ Jian:そうでなければ、処理待ちのスピーチがあったかどうかを判断するために、何らかの非ブロッキング方法を見つける必要があります。 – martineau

関連する問題