在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


相关文章
|
11天前
|
存储 数据库连接 API
Python环境变量在开发和运行Python应用程序时起着重要的作用
Python环境变量在开发和运行Python应用程序时起着重要的作用
55 15
|
1月前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
13天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
25天前
|
Java Unix 调度
python多线程!
本文介绍了线程的基本概念、多线程技术、线程的创建与管理、线程间的通信与同步机制,以及线程池和队列模块的使用。文章详细讲解了如何使用 `_thread` 和 `threading` 模块创建和管理线程,介绍了线程锁 `Lock` 的作用和使用方法,解决了多线程环境下的数据共享问题。此外,还介绍了 `Timer` 定时器和 `ThreadPoolExecutor` 线程池的使用,最后通过一个具体的案例展示了如何使用多线程爬取电影票房数据。文章还对比了进程和线程的优缺点,并讨论了计算密集型和IO密集型任务的适用场景。
47 4
|
7天前
|
数据采集 Java Python
爬取小说资源的Python实践:从单线程到多线程的效率飞跃
本文介绍了一种使用Python从笔趣阁网站爬取小说内容的方法,并通过引入多线程技术大幅提高了下载效率。文章首先概述了环境准备,包括所需安装的库,然后详细描述了爬虫程序的设计与实现过程,包括发送HTTP请求、解析HTML文档、提取章节链接及多线程下载等步骤。最后,强调了性能优化的重要性,并提醒读者遵守相关法律法规。
40 0
|
1月前
|
Python
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
|
1月前
|
Java Python
python知识点100篇系列(16)-python中如何获取线程的返回值
【10月更文挑战第3天】本文介绍了两种在Python中实现多线程并获取返回值的方法。第一种是通过自定义线程类继承`Thread`类,重写`run`和`join`方法来实现;第二种则是利用`concurrent.futures`库,通过`ThreadPoolExecutor`管理线程池,简化了线程管理和结果获取的过程,推荐使用。示例代码展示了这两种方法的具体实现方式。
python知识点100篇系列(16)-python中如何获取线程的返回值
|
1月前
|
监控 安全 算法
线程死循环确实是多线程编程中的一个常见问题,它可能导致应用程序性能下降,甚至使整个系统变得不稳定。
线程死循环是多线程编程中常见的问题,可能导致性能下降或系统不稳定。通过代码审查、静态分析、日志监控、设置超时、使用锁机制、测试、选择线程安全的数据结构、限制线程数、使用现代并发库及培训,可有效预防和解决死循环问题。
61 1
|
1月前
|
数据挖掘 程序员 调度
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
31 3
|
1月前
|
并行计算 安全 Java
Python 多线程并行执行详解
Python 多线程并行执行详解
69 3
下一篇
无影云桌面