2014-03-12 17 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