簡體   English   中英

從GUI程序連續寫入串行鏈接:需要使用線程嗎?

[英]Writing to a serial link continuously from a GUI program: need to use threads?

我用PyQt4編寫了一個GUI程序,它必須通過串行數據鏈接發送消息字符串。

我已經實現了一個帶有兩個按鈕小部件的GUI界面。 我需要通過串行鏈接連續發送數據,單擊第一個按鈕時每秒一次,然后在單擊第二個按鈕時停止。

我當前的程序只能在單擊按鈕的瞬間發送數據。 這是我寫的處理按鈕點擊信號的方法:

def sendMessage(self):
    while 1:
        print "Hello........"
        if checke == False:
            break

我是否需要使用線程來解決這個問題?

是。 GUI編程的關鍵是永遠不要在主線程上進行任何長操作,因為它會阻止整個程序直到該操作完成。

如果要通過網絡連續發送數據,請在后台線程中進行。

一些示例代碼。

class MessageWorker(QtCore.QThread):

    def __init__(self):
        super(ParserWorker, self).__init__()
        self.ok_to_send = False
        self.terminated = True

    def run(self):
        while not self.terminated:
            if self.ok_to_send:
                self.send_message()
            time.sleep(1)

     def start_send():
         self.ok_to_send = True

     def pause_send():
         self.ok_to_send = False

     def terminated():
         self.terminated = False

然后在主程序中調用

worker = MessageWorker()
worker.start() # Start the background thread
worker.start_send() # Start sending message
worker.pause_send() # Pause sending message
worker.terminated() # Stop sending message permanently

這取決於...如果發送操作很快,您可以使用QTimer類。 它與Qt事件循環集成,因此您不必擔心線程問題。 串行通信速度很慢,具體取決於您發送的數據量,因此我無法確定這是否適合您。

是的,你需要使用線程。 在任何基於GUI的程序中,任何需要花費大量時間的工作都應該始終在一個單獨的線程上進行,以避免阻塞UI - 每當看到“無響應”程序時,這幾乎總是由於程序失敗處理窗口消息,因為它的UI線程在一些長操作中被阻止。

啟動后台線程的一種簡單方法是使用threading模塊 以下是如何使用它每秒將數據寫入串口一次:

class MyClass:
    # This method will run on a separate thread
    def _serial_port_worker(self):
        while self._run_worker:
            self.send_data_to_serial_port()
            time.sleep(1)

    # Call this to start the worker thread
    def start_worker_thread(self):
        self._run_worker = True
        worker_thread = threading.Thread(target=self._serial_port_worker,
                                         args=(self,))
        worker_thread.start()

    # Call this to tell the worker thread to stop
    def stop_worker_thread(self):
        self._run_worker = False

基本上你有三個選擇:

  • 使用第二個線程來執行串行通信。 GUI工具包並不總是線程安全的,因此您只應從主線程調用它們。 另外,Python中的線程存在限制; 一次只有一個線程可以執行Python字節碼。
  • 使用GUI工具包的超時功能(可能以不同方式調用)來不時創建一個事件。 在事件處理程序中執行串行通信。 確保使用非阻塞讀寫(在pyserial ,在Serial對象中配置超時),否則您的應用可能會無響應。
  • 使用multiprocessing模塊從第二個程序進行串行通信。 即使第二個進程阻塞,也不會影響GUI。 您可以使用multiprocessing.Queue在QUI和其他進程之間進行通信。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM