QThreadPool类

用来管理 QThreads。此类中的所有函数都是线程安全的.

主要属性:

1、activeThreadCount: 此属性表示线程池中的活动线程数,通过activeThreadCount() 调用。

2、expiryTimeout: 线程活着的时间。没有设置expiryTimeout毫秒的线程会自动退出,此类线程将根据需要重新启动。默认的expiryTimeout为30000毫秒 (30 秒)。

如果expiryTimeout为负,则新创建的线程将不会过期, 在线程池被销毁之前, 它们将不会退出。通过expiryTimeout()调用,通setExpiryTimeout(int expiryTimeout)设置 。

3、maxThreadCount : int 表示线程池使用的最大线程数。
    通过maxThreadCount() 调用,通过setMaxThreadCount(int maxThreadCount) 设置
   注意:即使maxThreadCount限制为零或为负数, 线程池也至少有1个线程。

主要成员函数

QThreadPool *QThreadPool::globalInstance()

返回Qt应用程序全局线程池实例。

void reserveThread()

预约一个线程,这个函数总是会增加活动线程的数量。这意味着通过使用这个函数,activeThreadCount()可以返回一个大于maxThreadCount()的值。

void releaseThread()

释放以前通过调用reserveThread()预约的线程。
如果不先预约一个线程,调用这个函数会临时增加maxThreadCount()。当线程进入休眠等待时,能够允许其他线程继续。
要记得在完成等待时调用reserveThread(),以便线程池可以正确控制activeThreadCount()。

void QThreadPool :: start(QRunnable * runnable,int priority = 0)

在任务数量小于maxThreadCount时,为每个runnable任务预约一个线程。超过maxThreadCount时,将任务放入运行队列中。priority 参数用来设置线程运行优先级。

bool tryStart(QRunnable *runnable)

此方法尝试预约一个线程来运行runnable。
如果在调用的时候没有线程可用,那么这个函数什么都不做,并返回false。否则,将使用一个可用线程立即运行runnable,并返回此函数true。

void clear()

用于删除在任务队列中,还没有启动的任务。

bool tryTake(QRunnable *runnable)

如果runnable任务还没开始运行,那么从队列中删除此runable任务,此时函数返回true;如果runnable任务已经运行,返回false。
只用来删除runnable->autoDelete() == false的runnable任务,否则可能会删错任务.

bool waitForDone(int msecs = -1)

等待msecs毫秒, 以便所有线程退出并从线程池中移除所有线程。如果删除了所有线程, 则返回true ,否则, 它将返回false。默认等待时间为-1,即等待最后一个线程退出。

QRunnable类

QRunnable类是所有runable对象的基类。
QRunnable类是一个接口, 用于表示需要执行的任务或代码段, 具体任务在run() 函数内部实现。
可以使用QThreadPool在各个独立的线程中执行代码。如果autoDelete() 返回true (默认值), QThreadPool将自动删除QRunnable 。使用setAutoDelete() 可更改是否自动删除。

主要成员函数

bool autoDelete() const

获取自动删除是否启用,启用返回true,未启用返回false。

virtual void run() = 0

纯虚函数,在QRunnable子类中实现详细任务处理逻辑。

void setAutoDelete(bool autoDelete)

如果autoDelete为 true, 则启用自动删除。否则自动删除将被禁用。
如果启用了自动删除, QThreadPool将在调用 run () 函数返回后自动删除此runable对象。否则, runable对象所有权不属于线程池,由开发人员管理。
请注意, 必须先设置此标志,(默认构造函数已经将其设置为true),然后才能调用QThreadPool:: start()。在QThreadPool:: start() 之后调用此函数将导致不可预测后果。

调用此函数将导致不可预测后果。

程序:

任务类(runable类)头文件

 #ifndef PRINTTASK_H
#define PRINTTASK_H #include <QObject>
#include <QRunnable> class PrintTask : public QObject, public QRunnable
{
Q_OBJECT public:
PrintTask();
~PrintTask();
protected:
void run(); signals:
//注意!要使用信号,采用QObejct 和 QRunnable多继承,记得QObject要放在前面
void mySignal();
}; #endif // PRINTTASK_H

任务类(runable类)实现文件

 #include "printtask.h"
#include <QThread>
#include <iostream>
using std::cout;
using std::endl; PrintTask::PrintTask()
{
} PrintTask::~PrintTask()
{ } //线程真正执行的内容
void PrintTask::run()
{
cout << "PrintTask run 被调用,调用线程ID为:" << QThread::currentThread() << endl;
}

主函数文件:

 #include <QCoreApplication>
#include <QThreadPool>
#include "printtask.h" int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); //设置最大线程数为3的一个线程池
QThreadPool pool;
pool.setMaxThreadCount(); for(int i = ; i < ; i++)
{
pool.start(new PrintTask());
} return a.exec();
}

输出:

 PrintTask run 被调用,调用线程ID为:
PrintTask run 被调用,调用线程ID为:
PrintTask run 被调用,调用线程ID为:004F3868
PrintTask run 被调用,调用线程ID为:004F3848
PrintTask run 被调用,调用线程ID为:
PrintTask run 被调用,调用线程ID为:
PrintTask run 被调用,调用线程ID为:004F3848
PrintTask run 被调用,调用线程ID为:004F3868
PrintTask run 被调用,调用线程ID为:
PrintTask run 被调用,调用线程ID为:
PrintTask run 被调用,调用线程ID为:004F3848
PrintTask run 被调用,调用线程ID为:
PrintTask run 被调用,调用线程ID为:004F3868
PrintTask run 被调用,调用线程ID为:004F3848
PrintTask run 被调用,调用线程ID为:
PrintTask run 被调用,调用线程ID为:004F3868
PrintTask run 被调用,调用线程ID为:004F3848
PrintTask run 被调用,调用线程ID为:004F3868
...
...

分析打印结果发现:20个任务,只有3个线程(线程ID分别为00533678、004F3848,004F3868)去执行。

Qt 线程池QThreadPool类、QRunnable类的更多相关文章

  1. Qt线程池

    说明 Qt中可以有多种使用线程的方式: 继承 QThread,重写 run() 接口: 使用 moveToThread() 方法将 QObject 子类移至线程中,内部的所有使用信号槽的槽函数均在线程 ...

  2. C++11消息队列 + Qt线程池 + QRunnable执行任务简单模型

    1.模板类queue,包含头文件<queue>中,是一个FIFO队列. queue.push():在队列尾巴增加数据 queue.pop():移除队列头部数据 queue.font():获 ...

  3. QT 线程池 + TCP 小试(一)线程池的简单实现

    *免分资源链接点击打开链接http://download.csdn.net/detail/goldenhawking/4492378 很久以前做过ACE + MFC/QT 的中轻量级线程池应用,大概就 ...

  4. QT 线程池 + TCP 小试(三)实现最终功能

    *免分资源链接点击打开链接http://download.csdn.net/detail/goldenhawking/4492378 有了TCP.线程池,我们就可以把他们连接起来.使用最简单的 QMa ...

  5. Qt多线程-QThreadPool线程池与QRunnable

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThreadPool线程池与QRunnable     本文地址:https:/ ...

  6. 高并发之——不得不说的线程池与ThreadPoolExecutor类浅析

    一.抛砖引玉 既然Java中支持以多线程的方式来执行相应的任务,但为什么在JDK1.5中又提供了线程池技术呢?这个问题大家自行脑补,多动脑,肯定没坏处,哈哈哈... 说起Java中的线程池技术,在很多 ...

  7. 【高并发】不得不说的线程池与ThreadPoolExecutor类浅析

    大家好,我是冰河~~ 今天,我们一起来简单聊聊线程池中的ThreadPoolExecutor类,好了,不多说了,开始进入今天的正题. 一.抛砖引玉 既然Java中支持以多线程的方式来执行相应的任务,但 ...

  8. Qt 线程基础

    (转自:http://my.oschina.net/laopiao/blog/88158) 何谓线程? 线程与并行处理任务息息相关,就像进程一样.那么,线程与进程有什么区别呢?当你在电子表格上进行数据 ...

  9. Java线程池解析

    Java的一大优势是能完成多线程任务,对线程的封装和调度非常好,那么它又是如何实现的呢? jdk的包下和线程相关类的类图. 从上面可以看出Java的线程池主的实现类主要有两个类ThreadPoolEx ...

随机推荐

  1. 对比Node.js和Python 帮你确定理想编程解决方案!

    世上没有最好的编程语言.有些编程语言比其他编程语言用于更具体的事情.比如,你可能需要移动应用程序,网络应用程序或更专业化的系统,则可能会有特定的语言.但是我们暂时假设你需要的是一个相对来说比较简单的网 ...

  2. flask前后端数据交互

    1.后端如何得到前端数据1)如果前端提交的方法为POST:后端接收时要写methods=[‘GET’,‘POST’]xx=request.form.get(xx);xx=request.form[’‘ ...

  3. 关于 tf.image.crop_and_resize的使用

    https://blog.csdn.net/m0_38024332/article/details/81779544 关于 tf.image.crop_and_resize 的使用  最近在学习fas ...

  4. python format输出

    http://www.cnblogs.com/nulige/p/6115793.html 2.Format 方式 [[fill]align][sign][#][0][width][,][.precis ...

  5. gitee上传下载代码命令

    在想要下载的文件夹下,鼠标右键,git bash 1.输入git init 进行初始化 2.git remote add origin https://gitee.com/XXXXXXXXXXXXXX ...

  6. Dynamics CRM - 如何通过 C# Plugin 给 Contact的 主键(FullName)赋值

    Contact 是 CRM 默认带有的 Entity,主键是 <FullName>,根据开发需求,与主键相关的字段都被设置成隐藏,包括了<Full Name>,<Firs ...

  7. 23. docker 数据持久化 bind mounting

    1. bind mounting 和 data volume 的区别 data volume 需要在 Dockerfile 定义 Volume bind mounting 只需要 -v 指明 容器外部 ...

  8. Python笔记_第四篇_高阶编程_高阶函数_3.sorted

    1. sorted函数: 常用的排序分:冒泡排序.选择排序.快速排序.插入排序.计数器排序 实例1:普通排序 # 普通排序 list1 = [,,,,] list2 = sorted(list1) # ...

  9. IPO套路

    日前,温州市冠盛汽车零部件集团股份有限公司(以下简称:冠盛集团)在证监会官网更新了招股说明书,距离上会仅一步之遥.值得注意的是,这已经是公司第四次披露招股说明书,2018年6月,公司曾在IPO审核最严 ...

  10. MySQL-慢日志slow log

    文件结构 1.目录结构 drwxrwxr-x mysql mysql Mar bin drwxrwxr-x mysql mysql Dec : binlogdir -rw-r--r-- mysql m ...