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)

posted @ 2022-11-02 09:59  cnblogs_kk  阅读(361)  评论(0)    收藏  举报