1. 程式人生 > >PyQt5+socket程式設計介面卡住未響應

PyQt5+socket程式設計介面卡住未響應

現象:

  • 在利用PyQt5,python,socket編寫網路除錯上位機時,遇到了GUI介面卡住未響應,然後崩掉的問題。

原因:

  • 建立socket通訊中,很多地方都用了while True無限迴圈,這是為了保持伺服器監聽或者是客戶端接收資料。在命令列介面中,這樣寫while True到沒什麼問題,並不會導致崩潰問題。但在pyqt中,gui介面本身就是一個主執行緒,如果直接通過點選按鈕進入伺服器監聽或者是客戶端連線,這個時候就會立刻進入socket程式設計中的while True無限迴圈,這個迴圈是直接跑在了當前的主執行緒中,這是一個非常耗時的操作。在windows下,系統會認為這個程式執行出錯了,則會自動顯示未響應,進而關閉程式。

解決方法:

  • import threading
  • 為socket通訊開闢新執行緒即可,將通訊部份的while True迴圈和GUI介面的主執行緒區分開來,這樣就不會出現圖形介面未響應的問題。

新建執行緒的方法

socket通訊tcp伺服器模式為例:

  • 如果伺服器要滿足多個客戶端同時接入,同時傳遞訊息且不會相互干擾,那麼需要給監聽建立一個執行緒,也要給每個連線建立另一個執行緒。這裡說一下思路,tcpserver的建立中有兩個while True迴圈,要為每個迴圈建立一個執行緒才行。

socket通訊tcp客戶端模式為例:

def socket_open_tcpc(self):
"""
    按鈕啟動客戶端模式,開啟客戶端socket
"""
    .
    .    這裡表示其他函式
    .
    # 為客戶端模式建立一個新執行緒
    self.client_th = threading.Thread(target=self.tcp_client_concurrency)
    # 設定執行緒為守護執行緒,防止退出主執行緒時,子執行緒仍在執行
    self.client_th.setDaemon(True)
    # 新執行緒啟動
    self.client_th.start()

def tcp_client_concurrency(self)
"""
    功能:這是開啟執行緒後的處理函式,socket通訊中的while True迴圈要寫在這裡
"""

參考資料: