0

仕事が終わったときに入力を受け取るプログラムを実行しようとしています。私はいくつかのフォームを調べ、ドキュメントを調べました。これを Debian で実行していますが、このgetch 関数を使用して、リターン キーを押さずに文字を受け取ることができることを理解しています。それを分解するために、これは私が無限 while ループで実装しようとしているものです

  • 入力を取り込みます(ここではスレッドが機能しませんでした
  • 入力をキューに入れる
  • 実行中のジョブがない場合は、キューの前のアイテムを変数としてジョブを開始します

また、スレッド モジュールを実行して、別の命令を実行しています。これを行う方法はありますか?


更新:これは私がこれまでに試したことです:

まず、スレッド化モジュールのタイマーを使用して待機を停止しようとしましたが、次のようになりました。

def getchnow():    
        def time_up():
            answer= None
            print 'time up...'

    wait = Timer(5,time_up) # x is amount of time in seconds
    wait.start()
    try:
            print "enter answer below"
            answer = getch()
    except Exception:
            print 'pass\n'
            answer = None

    if answer != True:   # it means if variable have somthing 
            wait.cancel()       # time_up will not execute(so, no skip)
    return answer
line = getchnow()
#Add line variable to queue
#Do stuff with queue

ここでの問題は、まだユーザー入力を待っていることです。

次に、 getch 関数を別のスレッドに入れようとしました。

q = Queue.Queue
q.put(getch())  
if q.get() != True:   # it means if variable have somthing
    line = q.get()
    #Add line variable to queue
#Do stuff with queue

この試みでは何もできません。

4

2 に答える 2

0

このリンクの詳細を読んだところ、一番下に必要なものの実装がありました。

Linux でのノンブロッキング実装に select モジュールを使用しました。入力が受信されない場合、これは (ここでは 5 秒) でタイムアウトになります。getch 呼び出しが非ブロッキングで、スレッドが正常に終了できるように、スレッドで使用する場合に特に便利です。

# This class gets a single character input from the keyboard
class _GetchUnix:
    def __init__(self):
        import tty, sys
        from select import select
    def __call__(self):
        import sys, tty, termios
        from select import select
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
                tty.setraw(sys.stdin.fileno())
                [i, o, e] = select([sys.stdin.fileno()], [], [], 2)
                if i: 
                ch=sys.stdin.read(1)
                else: 
                ch='' 
        finally:
                    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
            return ch
getch = _GetchUnix()
# End Class
于 2013-03-09T00:49:37.083 に答える
0

も使用[i, o, e] = select([sys.stdin.fileno()], [], [], 2)しましたが、Windows では動作しない可能性があると聞きました。マルチスレッドの非ブロック入力の例が必要な場合は、次のようにします。

import threading
import sys
import time

bufferLock=threading.Lock()
inputBuffer=[]

class InputThread(threading.Thread):
    def run(self):
        global inputBuffer
        print("starting input")
        while True:
            line=sys.stdin.readline()
            bufferLock.acquire()
            inputBuffer.insert(0,line)
            bufferLock.release()

input_thread=InputThread()
input_thread.start()
while True:
    time.sleep(4)
    bufferLock.acquire()
    if len(inputBuffer)>0:
        print("Popping: "+inputBuffer.pop())
    bufferLock.release()
于 2015-07-02T15:37:00.100 に答える