PyQt5+socket编程界面卡住未响应

现象:

  • 在利用PyQt5,python,socket编写网络调试上位机时,遇到了GUI界面卡住未响应,然后崩掉的问题。
  • NetAssist 网络调试助手

原因:

  • 建立socket通信中,很多地方都用了while True无限循环,这是为了保持服务器监听或者是客户端接收数据。在命令行界面中,这样写while True到没什么问题,并不会导致崩溃问题。但在pyqt中,gui界面本身就是一个主线程,如果直接通过点击按钮进入服务器监听或者是客户端连接,这个时候就会立刻进入socket编程中的while True无限循环,这个循环是直接跑在了当前的主线程中,这是一个非常耗时的操作。在windows下,系统会认为这个程序运行出错了,则会自动显示未响应,进而关闭程序。

解决方法:

  • import threading
  • 为socket通信开辟新线程即可,将通信部份的while True循环和GUI界面的主线程区分开来,这样就不会出现图形界面未响应的问题。

新建线程的方法

socket通信tcp服务器模式为例:

  • 如果服务器要满足多个客户端同时接入,同时传递消息且不会相互干扰,那么需要给监听创建一个线程,也要给每个连接创建另一个线程。这里说一下思路,tcpserver的建立中有两个while True循环,要为每个循环创建一个线程才行。
  • 关于tcp服务器模式的例子,可以参考这里https://github.com/nicedayzhu/netAssist/blob/master/tcp_Logic.py

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循环要写在这里
"""

参考资料:

  • https://blog.csdn.net/u010139869/article/details/79505892
  • https://blog.csdn.net/qq_39687901/article/details/81531101

你可能感兴趣的:(Python,软件)