Skip to main content
 首页 » 编程设计

python之QThread 没有完成

2025年05月04日27dflying

我正在构建一个带有套接字连接的 GUI,该连接在 PyQt5 的后台线程中运行。除了 Qthread 从不发出完成信号外,一切都运行良好。也许这不是问题,我可以改变我的实现来解决它,但是一旦被移动的对象停止执行任何操作,Qthread 是否会继续运行的预期行为?

我应该在主类中编写一个函数来在完成线程后停止该线程,还是我可以将新内容移动到该线程而不产生任何后果?

class MyClass(PyQt5.QtWidgets.QMainWindow) 
    def __init__(self, parent=None): 
 
        # Setup thread for the socket control 
        self.simulThread = PyQt5.QtCore.QThread() 
        self.socketController = SocketController() 
        self.socketController.moveToThread(self.simulThread) 
        self.simulThread.started.connect(self.socketController.controlSocket) 
 
        self.simulThread.finished.connect(self.deadThread) 
 
        # Bind controls to events 
        self.ui.buttonConnect.clicked.connect(self.simulThread.start) 
        self.ui.buttonDisconnect.clicked.connect(lambda: self.socketController.stop()) 
 
   def deadThread(self, data): 
       print ("THREAD IS DEAD.") 
 
class SocketController(PyQt5.QtCore.QObject): 
    finished       = PyQt5.QtCore.pyqtSignal() 
 
    def __init__(self): 
        super(SocketController, self).__init__() 
        self.run = True; 
 
    def controlSocket(self): 
        #setup the socket 
 
        while self.run: 
            # do socket stuff 
            time.sleep(1) 
 
        #close the socket 
        self.finished.emit() 
 
    def stop(self): 
        self.run = False; 

请您参考如下方法:

A QThread有自己的事件循环来处理信号。 controlSocket方法阻止此事件循环直到 self.run == False .但这永远不会发生,因为 self.run仅设置为 False当控制返回到事件循环时,它可以处理运行 stop 的信号方法。

你可能想重新设计你的线程,而不是用一个 while 循环来阻塞 QThread事件循环,你构造一个QTimer在调用 #do socket stuff 的线程中每 1 秒编码一次。这样,控制权返回到线程事件循环,它可以处理停止信号(将更改为停止 QTimer 再次触发)