2014-03-12 18 views
0

所以我试图利用msvcrt.getch()在程序中的任何位置选择退出(不使用KeyBoardInterrupt)。Python事件循环 - 多线程 - 如何同时运行两位代码?

我的代码目前看起来是这样的:

进口MSVCRT 进口SYS

打印

while True: 
    pressedKey = msvcrt.getch() 
    if pressedKey == 'q':  
     sys.exit() 
    else: 
     # do some setup 
     if myvar == "string": 
      try: 
       # do stuff 
      except: 
       # do stuff 
     else: 
      #do stuff 

如何运行while循环( “在任何时候退出按q”)在我运行其他(# do stuff块)的同时检测到q的按键?

这样,如果用户继续使用该程序,他们只会运行一次。但如果他们击中q,那么程序将退出。

+0

如果没有键被按下,'msvcrt.getch()'会被阻塞。在我的[answer](http://stackoverflow.com/a/22366085/355230)中提到你的另一个问题时使用'msvcrt.kbhit()' - 它不会阻止。 – martineau

回答

1

你可以在一个单独的线程读取键或(更好)use msvcrt.kbhit() as @martineau suggested

#!/usr/bin/env python 
import msvcrt 
from Queue import Empty, Queue 
from threading import Thread 

def read_keys(queue): 
    for key in iter(msvcrt.getch, 'q'): # until `q` 
     queue.put(key) 
    queue.put(None) # signal the end 

q = Queue() 
t = Thread(target=read_keys, args=[q]) 
t.daemon = True # die if the program exits 
t.start() 

while True: 
    try: 
     key = q.get_nowait() # doesn't block 
    except Empty: 
     key = Empty 
    else: 
     if key is None: # end 
      break 
    # do stuff 

如果我想做一些在主代码时第二个线程检测到某个按键,怎么样我会就此采取行动吗?

,直到再次代码即达到q.get_nowait()你不给按键反应在主线程,你不会注意到的按键,直到“做的东西”完成循环的当前迭代。如果您需要做一些可能需要很长时间的事情,那么您可能需要在另一个线程中运行它(启动新线程或使用线程池,如果阻塞在某个时间点是可接受的)。

+0

Queue模块如何在这里工作? – evamvid

+0

另外,如何切换线程?即,如果我想在第二个线程检测到某个按键时在主代码中执行某些操作,那么我将如何处理该问题? – evamvid

+0

@evamvid:我已经更新了答案。 – jfs