2015-06-19 3 views
4

После долгой работы в SO, я до сих пор не нашел хорошего ответа на то, что я надеюсь, это довольно распространенная потребность. В основном мне нужен основной поток, чтобы делать «материал» до тех пор, пока он не получит вход, а затем подействует на этот вход, а затем вернется к исходному «материалу». Моя проблема каждый раз кажется, что мое выполнение программы, кажется, полностью останавливается на исходном входе, я называю это в потоке или в другом месте. Предупреждение Я довольно новичок в python, но я надеюсь, что это не должно быть слишком противным для реализации. Вот то, с чем я играю (вытащил из моего другого вопроса, на который был ответен мой вопрос с резьбой)Non-Blocking raw_input() в python

Итак, я пытаюсь написать программу, которая ищет нажатия клавиш, а затем делает что-то в основной программе на основе что пользователь вводит. Я пытаюсь запустить прослушивание клавиатуры в потоке, а затем сравнить что-то в переменной в моем основном цикле, но я никогда не собираюсь вводить ввод с клавиатуры. В приведенном ниже коде строка печати может быть обновлена ​​никогда не будет, а только блок else из основного цикла while. Что мне нужно сделать, чтобы мой основной цикл знал о нажатиях клавиш, нажатых пользователем?

import threading 
import time 

kbdInput = '' 
playingID = '' 

def kbdListener(): 
    global kbdInput 
    kbdInput = rawInput() 
    print "maybe updating...the kbdInput variable is: ",kbdInput 

listener = threading.Thread(target=kbdListener) 

while True: 
    print "kbdInput: ",kbdInput 
    print "playingID: ",playingID 
    if playingID != kbdInput: 
     print "Recieved new keyboard Input. Setting playing ID to keyboard input value" 
     playingID = kbdInput 
    else: 
     print "No input from keyboard detected. Sleeping 2 seconds" 
    time.sleep(2) 

ответ

1

Если вы на самом деле хотите, чтобы цикл while продолжался вечно, вам нужно будет создать новый поток и запустить его каждый раз, когда старая версия будет завершена.

Я обновил пример вопроса, чтобы сделать эту работу:

import threading 
import time 

kbdInput = '' 
playingID = '' 
finished = True 

def kbdListener(): 
    global kbdInput, finished 
    kbdInput = raw_input("> ") 
    print "maybe updating...the kbdInput variable is: {}".format(kbdInput) 
    finished = True 

while True: 
    print "kbdInput: {}".format(kbdInput) 
    print "playingID: {}".format(playingID) 
    if playingID != kbdInput: 
     print "Received new keyboard Input. Setting playing ID to keyboard input value" 
     playingID = kbdInput 
    else: 
     print "No input from keyboard detected. Sleeping 2 seconds" 
    if finished: 
     finished = False 
     listener = threading.Thread(target=kbdListener) 
     listener.start() 
    time.sleep(2) 
2

Вы создали нить, но забудьте запустить его:

listener = threading.Thread(target=kbdListener) 
listener.start() 
1

В дополнение к ответу MydKnight (пуск нить), вам необходимо изменить rawInput к raw_input, и она должна быть в какой-то sort while loop иначе вы получите только один raw_input().

0

Я нашел ответ принят не работает для меня - это все равно блокирует на raw_input даже в отдельном потоке. Однако, когда я переключил потоки вокруг, он сразу сработал.

import threading 

def mainWork(): 
    while 1: 
    #whatever you wanted to do until an input is received 

myThread = threading.Thread(target=mainWork) 
myThread.start() 

while 1: 
    input = raw_input() 
    #do stuff with input when it is received