当前位置: 首页 > article >正文

qt QRunnable 与 QThreadPool详解

1. 概述

QRunnable是所有runnable对象的基类,它表示一个任务或要执行的代码。开发者需要子类化QRunnable并重写其run()函数来实现具体的任务逻辑。而QThreadPool则是一个管理QThread集合的类,它帮助减少创建线程的成本,通过管理和循环使用单独的QThread对象来执行任务队列中的任务。每个Qt应用程序都有一个全局QThreadPool对象,可以通过调用globalInstance()来访问。

2. 重要方法
  • QRunnable类

    • run(): 这是一个纯虚函数,需要子类化QRunnable并实现这个函数来定义任务的具体行为。
    • setAutoDelete(bool autoDelete):设置任务执行完成后是否自动删除对象。
    • autoDelete()const:返回任务是否自动删除对象。

  • QThreadPool类

    • globalInstance(): 获取全局QThreadPool对象的静态方法。
    • start(QRunnable *runnable, int priority = 0): 启动一个新的任务。runnable参数是要执行的任务对象,priority参数用于设置任务的优先级。如果runnable的autoDelete属性为true,则QThreadPool会在任务执行完毕后自动删除runnable对象。
    • tryStart(QRunnable *runnable): 尝试立即启动一个任务。如果没有可用的线程,则此函数不执行任何操作并返回false。
    • waitForDone(int msecs = -1): 等待所有任务完成并从线程池中删除所有线程。msecs参数指定了最多等待的毫秒数,如果为-1(默认值),则忽略超时,直到最后一个线程退出。
    • activeThreadCount(): 返回当前正在工作的线程数量。
    • maxThreadCount(): 返回线程池允许的最大线程数量。
    • setMaxThreadCount(int maxThreads): 设置线程池允许的最大线程数量。
    • setExpiryTimeout(int expiryTimeout): 设置线程在未使用时到期的超时时间(毫秒)。默认值是30000毫秒(30秒)。
#include <QCoreApplication>
#include <QThreadPool>
#include <QRunnable>
#include <QDebug>
#include <QThread>

// 定义一个QRunnable的子类
class MyTask : public QRunnable
{
public:
    void run() override
    {
        qDebug() << "MyTask is running in thread:" << QThread::currentThread();
        // 在这里执行具体的任务逻辑
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 获取全局QThreadPool对象
    QThreadPool *threadPool = QThreadPool::globalInstance();

    // 创建一个MyTask对象并启动它
    MyTask *task = new MyTask();
    threadPool->start(task);

    // 等待所有任务完成(在这个简单示例中,我们只有一个任务)
    threadPool->waitForDone();

    return a.exec();
}

觉得有帮助的话,打赏一下呗。。

           


http://www.kler.cn/a/389199.html

相关文章:

  • Spark 核心概念与宽窄依赖的详细解析
  • 《AI 使生活更美好》
  • XML Schema 字符串数据类型
  • 51c视觉~合集6
  • 一文了解珈和科技在农业遥感领域的服务内容和能力
  • 鸿蒙华为商城APP案例
  • 【CSS】居中样式
  • Nginx性能调优的具体策略方法
  • opcua认证测试1108 增加对三菱,西门子,modbus支持
  • PySindy学习
  • 无人机避障——(局部规划方法)DWA(动态窗口法)
  • C#开发流程
  • 1.1 算法基本概念与复杂度分析
  • qt QWebSocketServer详解
  • 第十三届交通运输研究(上海)论坛┆智能网联汽车技术现状与研究实践
  • SpringBoot项目编译报错 类文件具有错误的版本 61.0, 应为 52.0
  • ssh2-sftp-client一键将你的前端项目部署到远程服务器,你只需要专注写bug就好了
  • Rust:GUI 开源框架
  • 数据库范式、MySQL 架构、算法与树的深入解析
  • 实现rtos操作系统 【二】基本任务切换实现
  • 大模型,智能家居的春秋战国之交
  • goframe开发一个企业网站 验证码17
  • DotNet使用CsvHelper快速读取和写入CSV文件的操作方法
  • Apache DolphinScheduler + OceanBase,搭建分布式大数据调度平台的实践
  • 2411d,右值与移动
  • linux入门教程:perl库