在python的应用程序中如何终止QThread 线程

简介: 在python的应用程序中如何终止QThread 线程

1. 前言

QThread 是 Qt 提供的一个用于多线程编程的类,而 Python 中可以使用 QThread 通过 PyQt 或 PySide2 模块进行调用。在多线程编程中,有时候我们需要在某些情况下终止线程的执行,比如保存一个耗时比较长的文件,中途执行取消保存的操作,就需要终止线程。本文将介绍一种在 Python 中终止 QThread 线程的方案。

2. 问题描述

假设我们有一个多线程的应用程序,其中一个线程负责进行一些耗时的计算操作,并在计算完成后通过信号通知主线程。现在有一个需求,我们希望当用户点击一个按钮时,能够立即中止正在进行的计算操作。如何实现这个需求呢?我们可以使用以下方案。

2. 1创建一个继承自 QThread 的子类

我们首先需要创建一个继承自 QThread 的子类,用于执行我们的耗时操作。以下是一个示例:

from PyQt5.QtCore import QThread, pyqtSignal
    class WorkerThread(QThread):
    finished = pyqtSignal()  # 用于发射任务执行完毕的信号
    def __init__(self):
        super().__init__()
        self.is_running = True  # 标志位,表示线程是否正在运行
    
    def run(self):
        while self.is_running:
            # 执行耗时操作
            self.do_work()
    
        self.finished.emit()
    
    def stop(self):
        self.is_running = False
    
    def do_work(self):
        # 执行耗时操作的函数
        pass

在上述代码中,我们创建了一个名为 WorkerThread 的子类,继承自 QThread 类。在 WorkerThread 类中,我们定义了一个 finished 信号,用于通知主线程任务执行完毕。同时,我们还添加了一个 is_running 标志位,表示线程是否正在运行。

在 run() 方法中,我们通过一个 while 循环来执行耗时操作。当 is_running True 时,继续执行循环体内的操作;当 is_runningFalse 时,终止循环并发射 finished 信号。

2.2 在主线程中创建并启动子线程

在主线程中,我们需要创建一个 WorkerThread 的实例,并调用 start() 方法来启动线程。以下是一个示例:

from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
from PyQt5.QtCore import Qt
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.thread = WorkerThread()
        self.thread.finished.connect(self.on_finished)
    
        self.button = QPushButton("Stop", self)
        self.button.clicked.connect(self.on_button_clicked)
    
        self.setCentralWidget(self.button)
    
    def on_button_clicked(self):
      # 结束线程
        self.thread.stop()
    
    def on_finished(self):
        self.button.setEnabled(False)
if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

在上述代码中,我们创建了一个名为 MainWindow 的类,继承自 QMainWindow。在 MainWindow 类的构造函数中,我们创建了一个 WorkerThread 的实例,并将它与 finished 信号关联。同时,我们还创建了一个按钮,点击按钮时会调用 on_button_clicked 方法。

on_button_clicked 方法中,我们调用了 stop() 方法来停止子线程的执行。

on_finished 方法中,我们禁用了按钮,防止用户重复点击。

2.3 执行中止操作

当用户点击按钮时,会触发 on_button_clicked 方法,从而调用 stop() 方法停止子线程的执行。在 stop() 方法中,我们将 is_running 标志位设置为 False,从而中止子线程的执行。

参考:https://blog.51cto.com/u_16175515/7225554


相关文章
|
10月前
|
数据采集 存储 JSON
Python爬取知乎评论:多线程与异步爬虫的性能优化
Python爬取知乎评论:多线程与异步爬虫的性能优化
|
10月前
|
人工智能 安全 调度
Python并发编程之线程同步详解
并发编程在Python中至关重要,线程同步确保多线程程序正确运行。本文详解线程同步机制,包括互斥锁、信号量、事件、条件变量和队列,探讨全局解释器锁(GIL)的影响及解决线程同步问题的最佳实践,如避免全局变量、使用线程安全数据结构、精细化锁的使用等。通过示例代码帮助开发者理解并提升多线程程序的性能与可靠性。
314 0
|
7月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
723 0
|
9月前
|
数据采集 消息中间件 并行计算
Python多线程与多进程性能对比:从原理到实战的深度解析
在Python编程中,多线程与多进程是提升并发性能的关键手段。本文通过实验数据、代码示例和通俗比喻,深入解析两者在不同任务类型下的性能表现,帮助开发者科学选择并发策略,优化程序效率。
722 1
|
存储 数据库连接 API
Python环境变量在开发和运行Python应用程序时起着重要的作用
Python环境变量在开发和运行Python应用程序时起着重要的作用
556 15
|
11月前
|
JSON 算法 Java
打造终端里的下载利器:Python实现可恢复式多线程下载器
在数字时代,大文件下载已成为日常需求。本文教你用Python打造专业级下载器,支持断点续传、多线程加速、速度限制等功能,显著提升终端下载体验。内容涵盖智能续传、多线程分块下载、限速控制及Rich库构建现代终端界面,助你从零构建高效下载工具。
691 1
|
10月前
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
10月前
|
数据采集 存储 Java
多线程Python爬虫:加速大规模学术文献采集
多线程Python爬虫:加速大规模学术文献采集
|
11月前
|
数据采集 网络协议 前端开发
Python多线程爬虫模板:从原理到实战的完整指南
多线程爬虫通过并发请求大幅提升数据采集效率,适用于大规模网页抓取。本文详解其原理与实现,涵盖任务队列、线程池、会话保持、异常处理、反爬对抗等核心技术,并提供可扩展的Python模板代码,助力高效稳定的数据采集实践。
565 0

推荐镜像

更多