QtCore.Qt.BlockingQueuedConnection 相关问题
信号和槽不能在同一个线程中,否则会死锁
所以需要将信号移入其他线程
self.work_thread = QtCore.QThread()
self.video_player = VideoPlayer()
self.video_player.moveToThread(self.work_thread)
self.work_thread.started.connect(self.video_player.run_work)
# QtCore.Qt.BlockingQueuedConnection
self.video_player.image_change_signal.connect(self.on_image_change_signal_changed)
self.video_player.paused_signal.connect(self.on_paused_signal)
# self.work_thread.finished.connect(self.video_player.deleteLater)
# self.work_thread.finished.connect(self.work_thread.deleteLater)
self.work_thread.finished.connect(self.on_thread_finished)
self.work_thread.start()
当界面close时,如果此时work_thread正好发送了一个信号,因为BlockingQueuedConnection模式,所以它需要等待主线程槽的执行完。但界面close,此槽函数永远不会返回。
解决方案:close时,先确保work_thread已经完全停止。并ignore此次close 事件。
等待线程完成的信号,再close。
#界面close event,on_thread_finished会再次调用close event,所以添加self.work_thread.isRunning():判断
def closeEvent(self, event) -> None:
if self.work_thread.isRunning():
self.video_player.stop()
self.work_thread.quit()
event.ignore()
#线程完成信号
self.work_thread.finished.connect(self.on_thread_finished)
#线程完成时,再关闭界面
def on_thread_finished(self):
self.parentWidget().close()
self.close_event_signal.emit(self)

浙公网安备 33010602011771号