现象:
- 在利用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循环,要为每个循环创建一个线程才行。
- 关于tcp服务器模式的例子,可以参考这里
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循环要写在这里
"""