在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天前
|
安全 Python
告别低效编程!Python线程与进程并发技术详解,让你的代码飞起来!
【7月更文挑战第9天】Python并发编程提升效率:**理解并发与并行,线程借助`threading`模块处理IO密集型任务,受限于GIL;进程用`multiprocessing`实现并行,绕过GIL限制。示例展示线程和进程创建及同步。选择合适模型,注意线程安全,利用多核,优化性能,实现高效并发编程。
25 3
|
10天前
|
安全 数据安全/隐私保护 数据中心
Python并发编程大挑战:线程安全VS进程隔离,你的选择影响深远!
【7月更文挑战第9天】Python并发:线程共享内存,高效但需处理线程安全(GIL限制并发),适合IO密集型;进程独立内存,安全但通信复杂,适合CPU密集型。使用`threading.Lock`保证线程安全,`multiprocessing.Queue`实现进程间通信。选择取决于任务性质和性能需求。
20 1
|
10天前
|
Python
解锁Python并发新世界:线程与进程的并行艺术,让你的应用性能翻倍!
【7月更文挑战第9天】并发编程**是同时执行多个任务的技术,提升程序效率。Python的**threading**模块支持多线程,适合IO密集型任务,但受GIL限制。**multiprocessing**模块允许多进程并行,绕过GIL,适用于CPU密集型任务。例如,计算平方和,多线程版本使用`threading`分割工作并同步结果;多进程版本利用`multiprocessing.Pool`分块计算再合并。正确选择能优化应用性能。
|
10天前
|
安全 Java 调度
「Python入门」Python多线程
1. **线程与进程区别**:线程共享内存,进程独立;线程启动快,多线程效率高于多进程。 2. **多线程使用**:直接使用Thread类,通过`target`指定函数,`args`传递参数;或继承Thread,重写`run`方法。 3. **守护线程**:设置`setDaemon(True)`,主线程结束时,守护线程一同结束。 4. **join线程同步**:主线程等待子线程完成,如`t.join()`。 5. **线程锁**(Mutex):防止数据竞争,确保同一时间只有一个线程访问共享资源。 6. **RLock(递归锁)**:允许多次锁定,用于需要多次加锁的递归操作。
17 1
「Python入门」Python多线程
|
3天前
|
安全 Python
在Python中,实现多线程
【7月更文挑战第16天】在Python中,实现多线程
17 6
|
1天前
|
开发者 Python
Python线程
【7月更文挑战第18天】Python线程
5 2
|
1天前
|
Python
Python线程是操作系统能够进行运算的最小单位
【7月更文挑战第18天】Python线程是操作系统能够进行运算的最小单位
4 1
|
5天前
|
消息中间件 安全 数据处理
Python中的并发编程:理解多线程与多进程的区别与应用
在Python编程中,理解并发编程是提高程序性能和响应速度的关键。本文将深入探讨多线程和多进程的区别、适用场景及实际应用,帮助开发者更好地利用Python进行并发编程。
|
6天前
|
缓存 并行计算 监控
了解 Python 线程
【7月更文挑战第8天】在Python多线程编程中,`threading`模块允许我们获取当前线程名字,通过`current_thread().name`获取。线程名字有助于调试、日志和资源管理。示例代码展示了如何创建线程并打印其名字。在实际应用中,线程命名应清晰、唯一且避免特殊字符,以提高代码可读性和维护性。多线程编程需注意线程安全、死锁、性能优化等问题。通过合理设计和测试,可以利用多线程提高程序并发性和效率。
10 1
|
11天前
|
数据处理 调度 Python
Python并发编程实战指南:深入理解线程(threading)与进程(multiprocessing)的奥秘,打造高效并发应用!
【7月更文挑战第8天】Python并发编程探索:使用`threading`模块创建线程处理任务,虽受限于GIL,适合I/O密集型工作。而`multiprocessing`模块通过进程实现多核利用,适用于CPU密集型任务。通过实例展示了线程和进程的创建与同步,强调了根据任务类型选择合适并发模型的重要性。