QThread 在线程仍然存在时被销毁 运行
QThread Destroyed while thread is still running
我正在尝试 运行 QThread 中的 ZeroMQ。我所做的是当消息到达时我发出 msg_received 信号。在 App class 中,show_my_window 方法连接到它,因此它会显示一个简单的对话框。
问题是当我关闭那个对话框时,我得到以下信息
QThread: Destroyed while thread is still running
Process finished with exit code -1073740791 (0xC0000409)
这是我的代码:
class ZMQThread(QThread):
msg_received = Signal()
def __init__(self):
super(ZMQThread, self).__init__()
self.context = zmq.Context()
self.socket = self.context.socket(zmq.REP)
self.socket.bind("tcp://*:3344")
def run(self):
while True:
message = self.socket.recv()
self.msg_received.emit()
class MyWindow(QtWidgets.QDialog):
def __init__(self):
super(MyWindow, self).__init__()
self.ui = Ui_MyDialog()
self.ui.setupUi(self)
self.ui.ButtonOK.clicked.connect(self.ok)
def ok(self):
self.accept()
class App:
def __init__(self):
self.qtapp = QtWidgets.QApplication([])
self.my_window = MyWindow()
self.zmq_thread = ZMQThread()
self.zmq_thread.msg_received.connect(self.show_my_window)
self.zmq_thread.start()
def show_my_window(self):
self.my_window.show()
if __name__ == '__main__':
my_gui = App()
sys.exit(my_gui.qtapp.exec())
我这里没有主 window,想知道这是否有问题?我不想要一个主要的 window,这个应用程序将 运行 在托盘上,但首先我想实现这部分。我已经检查了一些非常相似的问题,但是在检查了这些解决方案之后,它们并没有奏效。
这可能是什么问题?
默认情况下,Qt在最后一次打开window关闭时结束eventloop,而当eventloop结束时,QThread并没有正确关闭。解决方案是使用 quitOnLastWindowClosed
属性:
禁用此功能
self.qtapp = QtWidgets.QApplication([])
self.qtapp.setQuitOnLastWindowClosed(False)
我正在尝试 运行 QThread 中的 ZeroMQ。我所做的是当消息到达时我发出 msg_received 信号。在 App class 中,show_my_window 方法连接到它,因此它会显示一个简单的对话框。
问题是当我关闭那个对话框时,我得到以下信息
QThread: Destroyed while thread is still running
Process finished with exit code -1073740791 (0xC0000409)
这是我的代码:
class ZMQThread(QThread):
msg_received = Signal()
def __init__(self):
super(ZMQThread, self).__init__()
self.context = zmq.Context()
self.socket = self.context.socket(zmq.REP)
self.socket.bind("tcp://*:3344")
def run(self):
while True:
message = self.socket.recv()
self.msg_received.emit()
class MyWindow(QtWidgets.QDialog):
def __init__(self):
super(MyWindow, self).__init__()
self.ui = Ui_MyDialog()
self.ui.setupUi(self)
self.ui.ButtonOK.clicked.connect(self.ok)
def ok(self):
self.accept()
class App:
def __init__(self):
self.qtapp = QtWidgets.QApplication([])
self.my_window = MyWindow()
self.zmq_thread = ZMQThread()
self.zmq_thread.msg_received.connect(self.show_my_window)
self.zmq_thread.start()
def show_my_window(self):
self.my_window.show()
if __name__ == '__main__':
my_gui = App()
sys.exit(my_gui.qtapp.exec())
我这里没有主 window,想知道这是否有问题?我不想要一个主要的 window,这个应用程序将 运行 在托盘上,但首先我想实现这部分。我已经检查了一些非常相似的问题,但是在检查了这些解决方案之后,它们并没有奏效。 这可能是什么问题?
默认情况下,Qt在最后一次打开window关闭时结束eventloop,而当eventloop结束时,QThread并没有正确关闭。解决方案是使用 quitOnLastWindowClosed
属性:
self.qtapp = QtWidgets.QApplication([])
self.qtapp.setQuitOnLastWindowClosed(False)