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

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.lryc.cn/news/482256.html

相关文章:

  • 博客摘录「 java三年工作经验面试题整理《精华》」2023年6月12日
  • 福禄克FLUKE5500A与fluke5520a校准仪的区别功能
  • 量化交易系统开发-实时行情自动化交易-2.技术栈
  • 【逆向爬虫实战】--全方位分析+某某学堂登录(DES加密)
  • 第2关:装载问题 (最优队列法)
  • 萤石设备视频接入平台EasyCVR海康私有化视频平台监控硬盘和普通硬盘有何区别?
  • 【Webpack配置全解析】打造你的专属构建流程️(4)
  • 【SpringMVC】基础入门(1)
  • FFmpeg存放压缩后的音视频数据的结构体:AVPacket简介,结构体,函数
  • 用接地气的例子趣谈 WWDC 24 全新的 Swift Testing 入门(三)
  • #渗透测试#SRC漏洞挖掘#深入挖掘CSRF漏洞02
  • 基于OpenCV的相机捕捉视频进行人脸检测--米尔NXP i.MX93开发板
  • 【Node-Red】使用文件或相机拍摄实现图像识别
  • 【Arcpy】提示需要深度学习框架代码
  • 【蓝桥杯 2021 省 B2】特殊年份
  • 【云原生开发】namespace管理的后端开发设计与实现
  • 威联通Docker Compose搭建NAS媒体库资源工具NAS Tools
  • 【JAVA基础】MAVEN的安装及idea的引用说明
  • 【go从零单排】Rate Limiting限流
  • 解析Eureka的架构
  • AI变现,做数字游民
  • linux-vlan
  • 前端跨域~简述
  • GIN:逼近WL-test的GNN架构
  • NIST密码学未来展望:Naughty Step 上的 SHA-1、3DES 和 SHA-224
  • go 集成gorm 数据库操作
  • 进程 线程 和go协程的区别
  • STM32获取SHT3X温湿度芯片数据
  • 卸载miniconda3
  • 游戏中的设计模式及杂项