PyQt5+socket程式設計介面卡住未響應
阿新 • • 發佈:2019-01-11
現象:
- 在利用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迴圈要寫在這裡 """
參考資料: