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. .net APP接口

    编写APP接口首先要搭建测试环境,在实际开发中APP对于大多数公司来说都是选择外包,并不是公司内部人员负责,遇到事情不可能时时进行沟通和交流,也不能写每一个接口都要双方及时确认.个人经历是双方确认AP ...

  2. Java简单调用Lua

    package lua; import org.keplerproject.luajava.LuaState; import org.keplerproject.luajava.LuaStateFac ...

  3. opencv matchTemplate函数用法

    模板匹配函数,就是在一幅图中,找到另外一幅的在本图的相似的地方 CV_EXPORTS_W void matchTemplate( InputArray image, InputArray templ, ...

  4. dfs--迷宫

    题目背景 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫中移动有上下左右四种方式,每次只能移 ...

  5. Struts 2的下载和安装

    一.为Web应用增加Struts 2支持 下载和安装Struts 2步骤: 登录http://struts.apache.org/download.cgi站点,下载Struts 2的最新版,下载时有以 ...

  6. Cutting Sticks UVA - 10003(DP 仍有不明白的地方)

    题意:对一根长为l的木棒进行切割,给出n个切割点,每次切割的价值,等于需要切割的木头长度. 一开始理解错了,认为切割点时根据当前木条的左端点往右推算. 实际上,左端点始终是不变的一直是0,右端点一直是 ...

  7. 豆瓣爬虫Scrapy“抄袭”改写

    主要是把项目从docker里面扒拉出来,但是扒拉完好像又没有什么用,放在docker里面运行多好. 源码下载下面主要记一下改动的地方吧. 配置:在database.py中改掉自己的数据库配置. 表结构 ...

  8. python语法基础-并发编程-进程-进程锁和进程间通信

    ###############   守护进程  ############## """ 守护进程 父进程中将一个子进程设置为守护进程,那么这个子进程会随着主进程的结束而结束 ...

  9. 小白学习之pytorch框架(4)-softmax回归(torch.gather()、torch.argmax()、torch.nn.CrossEntropyLoss())

    学习pytorch路程之动手学深度学习-3.4-3.7 置信度.置信区间参考:https://cloud.tencent.com/developer/news/452418 本人感觉还是挺好理解的 交 ...

  10. ubuntu18安装pytorch1.3

    环境: ubuntu18 anaconda 创建一个新的环境 conda create -n env_name python=version 激活并进入环境中 conda activate env_n ...