Qt 中的线程池QRunnable和QThreadPool

news/2025/2/24 16:30:25

Qt 中的线程池QRunnable和QThreadPool

一、QThreadPool类介绍

QThreadPool 是 Qt 框架中用于管理线程池的类,它提供了一种高效的方式来管理和复用线程,避免频繁创建和销毁线程带来的开销。

1. 基本概念

QThreadPool 是一个全局的线程池,它维护了一组线程,并将任务分配给这些线程执行。线程池中的线程数量可以通过设置最大线程数来控制。当线程池中的线程被占用时,新任务会被排队等待执行。

2. 创建和使用线程池

Qt 提供了一个全局线程池 QThreadPool::globalInstance(),可以直接使用,也可以创建自己的线程池实例。

全局线程池的使用:

// 获取全局线程池
QThreadPool *threadPool = QThreadPool::globalInstance();
// 设置最大线程数(可选)
threadPool->setMaxThreadCount(4);

自定义线程池的使用:

QThreadPool *myThreadPool = new QThreadPool();
myThreadPool->setMaxThreadCount(8); // 设置最大线程数

3. 关键方法

以下是 QThreadPool 的一些常用方法:

(1) 设置线程池的最大线程数
void QThreadPool::setMaxThreadCount(int maxThreadCount);

用于设置线程池中允许的最大线程数。默认值通常是系统核心数的两倍。

(2) 启动任务
void QThreadPool::start(QRunnable *runnable);

将一个 QRunnable 对象提交到线程池中执行。

(3) 等待所有任务完成
void QThreadPool::waitForDone();

阻塞当前线程,直到线程池中的所有任务都完成。

(4) 获取全局线程池
static QThreadPool *QThreadPool::globalInstance();

返回全局线程池实例,通常用于共享程线池。

4. 注意事项

  1. 线程安全QThreadPool 是线程安全的,可以在多个线程中同时调用其方法。
  2. 任务的生命周期:任务对象(QRunnable 的子类)通常由线程池管理,任务完成后会被自动删除。如果需要手动管理任务对象的生命周期,可以在任务类中重写 autoDelete() 方法。
  3. 任务队列:当线程池中的线程被占用时,新任务会被放入队列中等待执行。
  4. 线程池的销毁:当线程池被销毁时,所有未完成的任务会被取消,线程池中的线程也会被销毁。

二、QRunnable类介绍

QRunnable 是 Qt 框架中用于表示可运行任务的类,它是线程池(QThreadPool)中任务的接口。通过继承 QRunnable 并重写其 run() 方法,可以创建一个可以在单独线程中执行的任务。QRunnable 是 Qt 实现线程池任务调度的核心机制之一。

1. QRunnable 的作用

QRunnable 是一个抽象类,用于表示一个可以被线程执行的任务。它的主要目的是将任务封装为一个对象,然后通过线程池(QThreadPool)或其他线程管理机制来执行这些任务。QRunnable 的设计使得任务的创建和执行解耦,从而提高了代码的可维护性和可扩展性。

2. QRunnable 的基本用法

要使用 QRunnable,通常需要执行以下步骤:

1继承 QRunnable:创建一个继承自 QRunnable 的类。

2.重写 run() 方法:在 run() 方法中实现任务的逻辑。

3.提交任务到线程池:通过 QThreadPoolstart() 方法将任务提交到线程池中执行。

3. QRunnable 的关键特性

(1) 自动删除

QRunnable 提供了一个 autoDelete() 方法,用于控制任务对象在执行完成后是否自动删除。默认情况下,autoDelete() 返回 true,表示任务对象会在执行完成后自动删除。如果需要手动管理任务对象的生命周期,可以在任务类中重写 autoDelete() 方法。

bool QRunnable::autoDelete() const;
(2) 设置优先级

QRunnable 允许设置任务的优先级,优先级高的任务会优先执行。

void QRunnable::setAutoDelete(bool autoDelete);
void QRunnable::setPriority(QThread::Priority priority);
(3) 线程安全

QRunnable 是线程安全的,可以在多个线程中同时创建和提交任务。

4. QRunnable 的应用场景

QRunnable 适用于以下场景:

1.并发任务:需要在多个线程中并发执行任务时,QRunnable 是一个很好的选择。

2.线程池管理:通过 QThreadPoolQRunnable,可以高效地管理线程池中的任务,避免频繁创建和销毁线程。

3.简化线程管理QRunnable 将任务封装为对象,使得任务的创建和执行更加清晰和易于管理。

5. QRunnable 和 QThread 的区别

虽然 QRunnableQThread 都可以用于多线程编程,但它们的用途和设计目标有所不同:

  • QThread
    • 是一个完整的线程类,提供了对线程生命周期的精细控制。
    • 适用于需要长期运行的线程,或者需要手动管理线程生命周期的场景。
    • 使用起来相对复杂,需要手动启动和停止线程。
  • QRunnable
    • 是一个任务类,用于表示一个可以在单独线程中执行的任务。
    • 通常与 QThreadPool 配合使用,适用于短时间任务的并发执行。
    • 使用起来相对简单,任务完成后会自动删除。

三、使用示例

下面通过一个代码示例来讲述如何使用:

#include <QCoreApplication>
#include <QThreadPool>
#include <QRunnable>
#include <QThread>
#include <QDebug>

class QMyTask:public QRunnable
{
public:
    QMyTask(int nID)
    {
        m_nID = nID;
    }

    ~QMyTask(){};

    virtual void run() override
    {
        qDebug() << "Task"<< m_nID << "Is Run On Thread" << QThread::currentThreadId();
        QThread::sleep(2); // 模拟耗时任务
        qDebug() << "Task" << m_nID << "finished";
    }

private:
    int m_nID;
};


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    QThreadPool* pThreadPool = QThreadPool::globalInstance();
    pThreadPool->setMaxThreadCount(4);

    for(int i=0;i<10;i++)
    {
        QMyTask* pTask = new QMyTask(i);
        pThreadPool->start(pTask);
    }

    pThreadPool->waitForDone();

    qDebug() << "All tasks are done.";


    return a.exec();
}

代码运行结果:

微信截图_20250223112303

四、总结

1.QThreadPool 提供了一种简单而高效的方式来管理线程,特别适合处理大量短时间任务的场景。通过合理设置线程池的大小和任务的管理方式,可以显著提高程序的性能和响应速度。

2.QRunnable 是 Qt 中用于表示可运行任务的类,它通过线程池(QThreadPool)实现任务的并发执行。通过继承 QRunnable 并重写 run() 方法,可以轻松创建和管理任务。QRunnable 的设计使得任务的创建和执行解耦,提高了代码的可维护性和可扩展性。在需要并发执行短时间任务时,QRunnable 是一个非常高效的选择。

参考文章:

1.QT线程池的使用:QThreadPool类和QRunnable类


http://www.niftyadmin.cn/n/5864571.html

相关文章

猿大师播放器:智慧安防网页播放RTSP H.265实时监控革命,无需转码终极解决方案

一、智慧安防的致命瓶颈&#xff1a;当传统技术拖累生命安全 在智慧城市、工业安全、应急指挥等场景中&#xff0c;实时视频监控是守护生命与财产的核心防线。然而&#xff0c;传统RTSP播放方案在延迟、成本、稳定性上的缺陷&#xff0c;正在成为安防系统的“阿喀琉斯之踵”。…

解锁Redis的深层能力:事务与消息队列的最佳实践

在当今数据驱动的世界里&#xff0c;高效的数据管理和处理成为了每一个成功应用的核心。Redis&#xff0c;作为一款高性能的内存数据库&#xff0c;不仅以其快速读写能力著称&#xff0c;还提供了诸如事务、持久化、以及灵活的消息队列实现等高级功能&#xff0c;使得开发者能够…

【Python爬虫(55)】Scrapy进阶:深入剖析下载器与下载中间件

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…

sql的索引与性能优化相关

之前面试的时候&#xff0c;由于在简历上提到优化sql代码&#xff0c;老是会被问到sql索引和性能优化问题&#xff0c;用这个帖子学习记录一下。 1.为什么要用索引 ------------------------------------------------------------------------------------------------------…

Ryu:轻量开源,开启 SDN 新程

1. Ryu 控制器概述 定位&#xff1a;轻量级、开源的SDN控制器&#xff0c;专为开发者和研究人员设计&#xff0c;基于Python实现。开发者&#xff1a;由日本NTT实验室主导开发&#xff0c;遵循Apache 2.0开源协议。核心理念&#xff1a;简化SDN应用开发&#xff0c;提供友好的…

Python基于flask的智慧交通可视化,大数据智慧交通数据可视化系统

博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战*✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447…

详解 torch.triu:上三角矩阵的高效构造(中英双语)

详解 torch.triu&#xff1a;上三角矩阵的高效构造 在深度学习和矩阵运算中&#xff0c;我们经常需要构造上三角矩阵&#xff08;Upper Triangular Matrix&#xff09;&#xff0c;其中主对角线以下的元素全部设为 0。PyTorch 提供了一个高效的函数 torch.triu()&#xff0c;用…

*PyCharm 安装教程

PyCharm 安装教程&#xff0c;适用于 Windows、macOS 和 Linux 系统&#xff1a; 1. 下载 PyCharm 官网地址&#xff1a;https://www.jetbrains.com/pycharm/版本选择&#xff1a; Community&#xff08;社区版&#xff09;&#xff1a;免费&#xff0c;适合基础 Python 开发…