2013-12-20 118 views
3

我有一個用Python編寫的應用程序,使用Tkinter。其中一個功能允許打開串行端口,之後通過串行端口接收的任何消息都將顯示在文本窗口中。這工作正常。當我關閉窗口時,問題就出現了,它並沒有終止監視串口的線程。然後必須手動殺死(或者,拔掉USB串行電纜導致殺死該過程的異常)。線程在退出tk窗口時不關閉

我假設我在這裏錯過了一些簡單的東西,但我會想關閉應用程序會關閉所有相關的線程。我似乎無法在文檔中找到任何有關此問題的信息,但我可能在錯誤的位置查找?

代碼的串行線的情況下,這是相關的:

class SerialThread(threading.Thread): 

    def __init__(self, queue, sp): 
     threading.Thread.__init__(self) 
     self.queue = queue 
     self.ser_handle = sp; 

    def run(self): 
     while True: 
      if self.ser_handle.inWaiting(): 
       text = self.ser_handle.readline(self.ser_handle.inWaiting()) 
       self.queue.put(text) 
      time.sleep(0.2) 

回答

2

你必須有辦法要求線程停止,你可以完成,使用:threading.Event

class SerialThread(threading.Thread): 

    def __init__(self, queue, sp): 
     threading.Thread.__init__(self) 
     self.queue = queue 
     self.event = threading.Event() # An event object. 
     self.ser_handle = sp; 

    def stop(self): 
     self.event.set() 

    def run(self): 
     while not self.event.isSet(): 
      if self.ser_handle.inWaiting(): 
       text = self.ser_handle.readline(self.ser_handle.inWaiting()) 
       self.queue.put(text) 
      time.sleep(0.2) 

然後在上接近事件你的窗口,調用your_thread.stop()