第六国际 2024-09-23 11:43 采纳率: 58.3%
浏览 7
已采纳

Pyqt 如何安全立即中止Qthread?

当我的任务正在执行文件操作时,如果使用terminate 中止Qthread线程后,开启新的任务或者重新执行中止的任务后,执行文件的操作会被阻塞,任务无法继续执行,也没有报错(我的项目里没有使用锁,阻塞跟锁没有关系)。怎么安全的立即中止掉Qthread线程?

# 执行操作线程
class WorkerThread(QThread):
    finished = pyqtSignal(object)

    def __init__(self, param=None):
        super().__init__()
        self.param = param

    def run(self):
        # 模拟耗时操作
        try:
            analyse(self.param)
            self.finished.emit()
        except Exception as e:
            traceback.print_exc()


class PythonToJS(QObject):
    def __init__(self, view):
        super().__init__()
        self.th = None

    # 执行
    def run(self, reportId):
        try:
            self.th = WorkerThread(reportId)
            self.th.finished.connect(self.finished)
            self.th.start()
        except Exception as e:
            print('e', e)

    # 终止任务
    @pyqtSlot(str)
    def terminate(self):
        if self.th:
            self.th.terminate()
            self.th.wait()
            self.th = None
  • 写回答

17条回答 默认 最新

  • 阿里嘎多学长 2024-09-23 13:40
    关注

    AIGC生成:


    Pyqt 如何安全立即中止Qthread?

    terminate 方法可以立即中止 QThread,但是它不会释放线程所占用的资源,包括文件操作的锁定。如果你想要安全地中止 QThread,可以使用 QThread::requestInterruption() 方法。

    在你的 QThread 中,使用 QThread::isInterruptionRequested() 方法来检查是否有中止请求,然后根据需要进行相应的处理。

    例如:

    class MyThread(QThread):
        def run(self):
            while True:
                # 文件操作
                if self.isInterruptionRequested():
                    break
            # 中止请求处理
            print("Thread interrupted")
    

    在主线程中,可以使用 QThread::requestInterruption() 方法来请求中止线程:

    my_thread = MyThread()
    my_thread.start()
    # 等待线程执行一段时间
    my_thread.requestInterruption()
    my_thread.wait()
    

    这样可以安全地中止 QThread,释放资源,并且不会阻塞新的任务或重新执行中止的任务。


    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(16条)

报告相同问题?

问题事件

  • 已采纳回答 9月24日
  • 修改了问题 9月23日
  • 修改了问题 9月23日
  • 赞助了问题酬金15元 9月23日
  • 展开全部

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?