Qt多线程编程之线程池

news2024/11/15 21:20:58

QThreadPool与QRunnable

线程的创建及销毁需要与系统交互,会产生很大的开销。若需要频繁的创建线程建议使用线程池,有线程池维护一定数量的线程,当需要进行多线程运算时将运算函数传递给线程池即可。线程池会根据可用线程进行任务安排。

QThreadPool

此类为Qt提供的线程池函数,使用此类只需要配置线程池的最大线程数量、线程长时间不使用的过期时间等参数,不需要进行QThread相关的操作。

此类有两种使用方式:全局线程池和局部线程池。

Public Function

int activeThreadCount() const //当前的活动线程数量

void clear()//清除所有当前排队但未开始运行的任务

int expiryTimeout() const//线程长时间未使用将会自动退出节约资源,此函数返回等待时间

int maxThreadCount() const//线程池可维护的最大线程数量

void releaseThread()//释放被保留的线程

void reserveThread()//保留线程,此线程将不会占用最大线程数量,从而可能会引起当前活动线程数量大于最大线程数量的情况

void setExpiryTimeout(int expiryTimeout)//设置线程回收的等待时间

void setMaxThreadCount(int maxThreadCount)//设置最大线程数量

void setStackSize(uint stackSize)//此属性包含线程池工作线程的堆栈大小。

uint stackSize() const//堆大小

void start(QRunnable *runnable, int priority = 0)//加入一个运算到队列,注意start不一定立刻启动,只是插入到队列,排到了才会开始运行。需要传入QRunnable ,后续介绍

bool tryStart(QRunnable *runnable)//尝试启动一个

bool tryTake(QRunnable *runnable)//删除队列中的一个QRunnable,若当前QRunnable 未启动则返回成功,正在运行则返回失败

bool waitForDone(int?<i>msecs</i>?=?-1)//等待所有线程运行结束并退出,参数为等待时间-1表示一直等待到最后一个线程退出

全局线程池

QThreadPool提供了一个静态函数,globalInstance(),使用此方法可获取一个当前进程的全局线程池,可在多个类中共同使用一个线程池。

局部线程池

和常规类的使用相同,可以通过QThreadPool pool;的方式建立一个局部线程池,并由当前类维护,可保证此线程池仅供当前类应用

QRunnable类

QRunnable类在Qt中是所有可运行对象的基类,代表了由run()函数表示的一个任务或一段要执行的代码。我们一般使用该类和QThreadPool来在另一个独立的线程中执行该代码。并且,如果QRunnable对象的autoDelete()设为true的话,QThreadPool会在run()运行结束后自动删除该对象

QRunnable有run、autodelete、setautodelete这三个关键函数。

重写run函数

protected:
    void run();

QRunable与线程池例子

程序演示:

创建线程池,定义线程数量为15,在里面取出两个线程去进行业务逻辑处理,这里的逻辑处理就是打印0~10

创建一个MyRUnable类,继承QObjectQRunnable

myrunable.h:

#ifndef MYRUNABLE_H
#define MYRUNABLE_H

#include <QObject>
#include <QRunnable>
#include <QDebug>
#include <QThread>

class MyRunable :public QObject, public QRunnable
{
    Q_OBJECT
public:
    explicit MyRunable(QObject *parent = nullptr);
    ~MyRunable();
protected:
    void run();
};
#endif // MYRUNABLE_H

myrunable.c

#include "myrunable.h"
MyRunable::MyRunable(QObject *parent) : QObject(parent)
{
}

MyRunable::~MyRunable()
{
    qDebug()<<"delete Task";
}

void MyRunable::run()
{
    int i = 10;
    while(i--)
    {
        qDebug() << "线程id:"<< QThread::currentThreadId()<< QString(":剩余%1").arg(i);
        QThread::sleep(1);
    }
}

main.c

#include <QCoreApplication>
#include <QDebug>
#include <QThread>
#include <QThreadPool>
#include"myrunable.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << "main thread id: " << QThread::currentThreadId();
    QThreadPool::globalInstance()->setMaxThreadCount(15);   //设置线程池最大线程数量
    MyRunable* task = new MyRunable();
    task->setAutoDelete(true);          //autoDelete属性默认为true   QThreadPool会在run()函数运行结束后,自动删除了MyTask对象
    QThreadPool::globalInstance()->start(task);             //任务放进线程池
    QThread::sleep(1);
    MyRunable* task1 = new MyRunable();
    task1->setAutoDelete(true);
    QThreadPool::globalInstance()->start(task1);

    QThreadPool::globalInstance()->waitForDone();           //等待任务结束
    qDebug() << "end";
    return a.exec();
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/657250.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android studio自动登录和记住密码的实现

Android studio自动登录和记住密码的实现 文章目录 Android studio自动登录和记住密码的实现前言一、效果二、设计思路三、知识点介绍1. SharedPreferenced2. checkButton就不介绍了 四、自动登录及记住密码实现总结与补充 前言 大家好&#xff0c;我是oy&#xff0c;今天介绍…

浅层神经网络

目录 1、神经网络表示 2、计算神经网络的输出 3、多个样本的向量化 4、激活函数 5、激活函数的导数 6、神经网络的梯度下降法 1、神经网络表示 输入层&#xff1a;有输入特征&#x1d465;1、&#x1d465;2、&#x1d465;3隐藏层&#xff1a;四个结点&#xff0c;表示你…

验证性实验 - 逻辑回归

练习2&#xff1a;逻辑回归 介绍 在本练习中&#xff0c;您将实现逻辑回归并将其应用于两个不同的数据集。还将通过将正则化加入训练算法&#xff0c;来提高算法的鲁棒性&#xff0c;并用更复杂的情形来测试模型算法。 在开始练习前&#xff0c;需要下载如下的文件进行数据上…

前端Vue非常简单实用商品分类展示组件 侧边商品分类组件

前端vue非常简单实用商品分类展示组件 侧边商品分类组件 &#xff0c; 下载完整代码请访问uni-app插件市场址:https://ext.dcloud.net.cn/plugin?id13084 效果图如下&#xff1a; #### 使用方法 使用方法 <!-- flist:第一级数组 slist&#xff1a;第二级数组 tlist&…

JS 介绍 Babel 的使用及 presets plugins 的概念

一、Babel 是什么 Bebal 可以帮助我们将新 JS 语法编译为可执行且兼容旧浏览器版本的一款编译工具。 举个例子&#xff0c;ES6&#xff08;编译前&#xff09;&#xff1a; const fn () > {};ES5&#xff08;编译后&#xff09;&#xff1a; var fn function() {}二、B…

NLP实战:使用Word2vec实现文本分类

目录 一、数据预处理 1、加载数据 2. 构建词典 3.生成数据批次和迭代器 二、模型构建 1.搭建模型 2.初始化模型 3.定义训练与评估函数 三、训练模型 1. 拆分数据集并运行模型 2. 测试指定数据 &#x1f368; 本文为[&#x1f517;365天深度学习训练营]内部限免文章&…

设计模式篇---单例模式

文章目录 概念结构与实现优缺点 概念 单例模式是结构最简单的设计模式&#xff0c;通过单例模式可以保证在整个系统中的一个类只有一个实例&#xff0c;从而节约系统资源。举个例子&#xff0c;比如windows电脑下的任务管理器只能打开一个&#xff0c;这个就是单例模式&#x…

【C语言进阶】程序员必备技能之文件操作

目录 &#x1f945;什么是文件&#xff1a; &#x1f3d1;程序文件&#xff1a;&#x1f3d1;数据文件&#xff1a; &#x1f3d1;文件名&#xff1a; &#x1f945;文件的打开和关闭&#xff1a;&#x1f3d1;文件指针&#xff1a; &#x1f3d1;fopen和fclose&#xff1a; &a…

genlogic GLG -CE 4.3 For Java/C#/C++ Crack

GLG CE工具包是一个极其灵活和强大的图形框架&#xff0c;用于构建显示实时数据的可视化界面&#xff0c;例如过程控制和监控的操作员显示、SCADA / HMI模拟和图表、 交通、遥测和网络监控显示&#xff0c;以及其他任务关键应用程序。 航电仪表板演示 该工具包包括 用于创建动…

面向对象三大特征

面向对象三大特征 众所周知&#xff0c;面向对象有三大特征 封装继承多态 封装继承多态&#xff0c;就好像武侠小说里的“金、木、水、火、土”一样&#xff0c;相生相克 封装 封装就像是武侠里的金钟罩铁布衫&#xff0c;把对象的数据和方法封装起来&#xff0c;对外只暴露…

C语言strstr函数的使用和模拟实现

strstr 函数原型&#xff1a; char *strstr( const char *string, const char *strCharSet );const char *string 要搜索的字符串const char *strCharSet 子串char *strstr 返回第一个出现字串的起始地址&#xff0c;方便函数链式访问 函数作用&#xff1a; 在 string 字符串…

逻辑越权之验证码|token|接口(36)

token是类似于会话一串数字代表数据包的唯一性&#xff0c;数据包的编号&#xff0c;防止一些csrf&#xff0c;或者一些存放数据包的攻击&#xff1b;一般数据包里面有token&#xff0c;就会检验数据包的唯一性&#xff0c;就会造成提交数据包&#xff0c;被token拦截掉。 验证…

第八章 图像压缩

文章目录 第八章 图像压缩8.1基础知识8.1.1 编码冗余8.1.4图像信息的度量8.1.5保真准则8.1.6图像压缩模型8.17图像格式、容器和压缩标准 8.2一些基本的压缩方法8.2.1霍夫曼编码8.2.2Golomb编码8.2.3算术编码8.2.4LZW编码8.2.5行程编码8.2.6基于符号的编码8.2.7比特平面编码8.2.…

JVM调优常用的工具JPS、JMAP、JSTAT、JSTACK和JCMD的使用详解

查看PID信息 首先启动一个服务 使用jps 和 jps -l 的区别&#xff0c;使用jps -l 能够显示出服务的名称 熟悉JVM调优中常用的工具JMAP、JSTAT和JSTACK JMAP、JSTAT和JSTACK是Java开发中常用的工具&#xff0c;用于分析和调试Java应用程序。它们的使用场景如下&#xff1a; JMA…

S7 1200 CM1241组态modbus rtu

S7 1200 V4.5版本 CM1241 V2.0版本 1 一开始遇到问题 CM1241 绿色灯一直闪烁, PLC 显示LED红色错误 网上查找可能固件不匹配 我一开始选的V2.2 最后选到V2.0才行 如果CM1241 绿灯变为常亮, 这样才是正确组态 如果不是常亮,那么是没有输出的 2 程序 弄了M1.0来启动配置m…

K-means算法

文章目录 1. K-means算法简介2. K-means算法原理2.1 算法具体步骤2.2 k取值方法2.2.1 手肘法2.2.2 轮廓系数法 2.3 K-means2.4 算法终止条件 3. K-means算法特点4. K-means算法应用场景5. K-means算法的Python应用5.1 K-means算法的Python实现5.2 sklearn.cluster.Kmeans函数的…

【Linux】timerfd——定时器

文章目录 前言认识 timerfdAPI timerfdAPI clock 官方示例简单使用epoll实现 前言 在 Linux 系统编程中&#xff0c;使用 timerfd 实现定时器功能是一种更加可靠、高效、灵活的方式。本文是对 timerfd 的简单使用&#xff0c;不涉及太过深入知识&#xff0c;熟练掌握几个常用 …

该死的科斯定理和三条保命原则

* * * 原创&#xff1a;刘教链 * * * 号外&#xff1a;今天在“刘教链”公众号次条发表了《内参&#xff1a;美联储下半年加息时间表和路径》&#xff0c;一号两文无法直接链接&#xff0c;请大家点击公众号卡片进入文章列表打开阅读。星球会员可以直接打开知识星球或discord …

企业级微服务架构实战项目--xx优选3-mq+nacos+es实现上下架

一 nacosmqes实现上下架 1.1 架构图 1.2 工程结构 1.3 核心代码流程 1.3.1 请求product模块 2.修改数据库&#xff0c;推送rabbitmq中 1.3.2 rabbitmq的工具类 1.3.3 search模块中rabbit客户端订阅信息 1.监听器监听信息 2.调用相应的上下架方法 2.1 调用product模块&…

c#网编实验五--WCF和TCP消息通信实验

分别编写服务端和客户端程序&#xff0c;利用基于WCF的TCP技术&#xff0c;实现在线聊天功能&#xff0c;完成在线用户列表管理&#xff0c;消息发送、接收的功能。 在同一个解决方案中&#xff0c;分别编写服务端程序和客户端程序&#xff0c;利用TCP实现简单的群聊功能。 具…