我正在构建一个带有套接字连接的 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 再次触发)
