Qt线程:线程池——QThreadPool 和 QRunnable

2023-05-16

QThreadPool

一、描述

QThreadPool 类管理 QThread 的集合。

QThreadPool 管理和回收单独的 QThread 对象,以减少使用线程的程序中的线程创建成本。

每个 Qt 应用程序都有一个全局 QThreadPool 对象,可以通过调用 globalInstance() 来访问它。

要使用 QThreadPool,需要子类化 QRunnable 并实现 run() 虚函数。然后创建该类的对象并将其传递给 QThreadPool::start()。QThreadPool 默认自动删除 QRunnable。

QThreadPool 是管理线程的低级类,Qt Concurrent 模块是更高级的方案。

  class HelloWorldTask : public QRunnable
  {
      void run() override
      {
          qDebug() << "Hello world from thread" << QThread::currentThread();
      }
  };

  HelloWorldTask *hello = new HelloWorldTask();
  // QThreadPool 取得 hello 的所有权并自动删除它
  QThreadPool::globalInstance()->start(hello);

二、属性成员

1、activeThreadCount : const int

线程池中的活动线程数。

2、expiryTimeout : int

在 expiryTimeout 毫秒内未使用的线程被认为已过期并将退出。此类线程将根据需要重新启动。 默认是30000 毫秒(30 秒)。

如果此属性为负,则新创建的线程不会过期,例如,直到线程池被销毁它们才会退出。

设置 expiryTimeout 对已经运行的线程没有影响。

建议在创建线程池之后调用 start() 之前设置此属性。

3、maxThreadCount : int

线程池使用的最大线程数。默认值是 QThread::idealThreadCount()。

注意:线程池将始终使用至少 1 个线程,即使 maxThreadCount 设置为零或负数。

4、stackSize : uint

线程池工作线程的堆栈大小。默认值为 0,表示 QThread 使用操作系统默认堆栈大小。

更改它对已创建或正在运行的线程没有影响。

5、threadPriority : QThread::Priority

新工作线程的线程优先级。

该属性的值仅在线程池启动新线程时使用。 更改它对已经运行的线程没有影响。

默认值为 QThread::InheritPriority,这使得 QThread 使用与 QThreadPool 对象所在的优先级相同的优先级。


三、成员函数

1、~QThreadPool()

销毁 QThreadPool。此函数将阻塞,直到所有QRunnable完成

2、void clear()

从队列中删除尚未启动的QRunnable对象。删除 QRunnable::autoDelete() 返回 true 的对象。

3、bool contains(const QThread *thread)

thread是否由线程池管理的线程。

4、[static] QThreadPool *globalInstance()

获取全局 QThreadPool 对象。

5、void start(QRunnable *runnable, int priority = 0)

保留一个线程并使用该线程来运行runnable,(除非该线程会使当前线程计数超过maxThreadCount())。runnable 会被添加到运行队列中。优先级参数可用于控制运行队列的执行顺序。

  • 如果 runnable->autoDelete() 返回 true,线程池将拥有 runnable 的所有权,并且 runnable->run() 返回后,线程池将自动删除 runnable。
  • 如果 runnable->autoDelete() 返回 false,则 runnable 的所有权仍归调用者所有。

在调用此函数后更改 runnable 的自动删除(QRunnable::setAutoDelete())会导致未定义的行为。

6、void start(std::function<void ()> functionToRun, int priority = 0)

重载函数。

例:

#include <QThreadPool>
#include <functional>

void showMSG()
{
    qDebug()<<"showMSG Thread ID:"<<QThread::currentThreadId();
    qDebug()<<"run showMSG";
}

int main(int argc, char *argv[])
{
    qDebug()<<"main Thread ID:"<<QThread::currentThreadId();
    std::function<void()> fun = showMSG;
    QThreadPool::globalInstance()->start(fun);
}

7、bool tryStart(QRunnable *runnable)

尝试保留一个线程来运行 runnable。

如果调用时没有可用线程,则此函数不执行任何操作并返回 false。 否则 runnable 将立即使用一个可用线程运行,并且返回 true。

关于runnable对象的所有权见上面的start()。

8、bool tryStart(std::function<void ()> functionToRun)

重载函数。

尝试保留一个线程来运行 functionToRun。

如果调用时没有可用线程,则此函数不执行任何操作并返回 false。 否则 functionToRun 立即使用一个可用线程运行,并且返回 true。

9、bool tryTake(QRunnable *runnable)

如果runnable尚未启动,则尝试从队列中删除指定的 runnable。

如果 runnable 尚未启动,则返回 true,并且 runnable 的所有权转移给调用者(即使 runnable->autoDelete() == true)。 否则返回false。

注意:如果runnable->autoDelete() == true,这个函数可能会删除错误的runnable。 这被称为 ABA 问题:原始的 runnable 可能已经执行并已被删除。 内存被重新用于另一个QRunnable 对象。因此,我们建议仅对未自动删除的QRunnable 对象调用此函数。

10、bool waitForDone(int msecs = -1)

让所有线程退出并从线程池中删除所有线程,最多等待 msecs 毫秒然后看退出和删除的结果。如果删除了所有线程返回 true,否则返回false。 如果 msecs 为 -1(默认值),则忽略超时(等待最后一个线程退出)。 

11、void reserveThread() 

保留一个线程,不考虑 activeThreadCount() 和 maxThreadCount()。

调用此函数后应调用releaseThread() 以允许重用它。

注意:此函数将始终增加活动线程的数量。 这意味着通过使用这个函数,activeThreadCount() 有可能返回一个大于 maxThreadCount() 的值。

12、void releaseThread()

释放先前通过调用reserveThread() 保留的线程。(处理activeThreadCount() 有可能返回一个大于 maxThreadCount() 的值的情况,以便线程池可以正确控制activeThreadCount())


QRunnable

一、描述

QRunnable 类是一个接口,用于表示需要执行的任务或代码段,由重新实现的 run() 函数表示。
可以使用 QThreadPool 在单独的线程中执行代码。

二、成员函数

1、[static] QRunnable *create(std::function<void ()> functionToRun)

创建一个在 run() 中调用 functionToRun 的 QRunnable。默认情况下启用自动删除。

2、void run()

线程中要执行的代码。

3、void setAutoDelete(bool autoDelete)

设置是否启用自动删除。

如果开启了自动删除,QThreadPool会在调用run()后自动删除这个QRunnable 对象。

请注意,必须在调用 QThreadPool::start() 之前设置此标志。在 QThreadPool::start() 之后调用此函数会导致未定义的行为。

当启用 autoDelete 时,使用相同的 QRunnable 多次调用 QThreadPool::start() 会产生race condition(竞争条件:多个线程同时访问相同的共享数据,而造成数据的不一致性),因此不推荐使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt线程:线程池——QThreadPool 和 QRunnable 的相关文章

  • C语言:通讯录的简单实现

    目录 前言 一 题目要求和设计思路 xff1a 1 主函数内 xff1a 1 gt 基础框架 xff1a 2 gt 需要定义的变量 2 头文件列表 1 gt 结构体contacts和结构体maillist 2 gt 定义常量 3 功能函数
  • YApi启动命令

    1 进入Yapi安装目录 yapi my yapi vendors 2 启动命令 pm2 start server app js watch
  • 算法设计题3.18-栈和队列-第3章-《数据结构习题集》-严蔚敏吴伟民版

    习题集完整源码部分 第3章 栈和队列 数据结构习题集 严蔚敏 吴伟民版 源码使用说明 链接 数据结构 xff08 严蔚敏 吴伟民版 xff09 课本源码 43 习题集解析使用说明 课本源码合辑 链接 数据结构 课本源码合辑 习题集全解析 链
  • Ansible的基本搭建安装与配置及各参数选项的作用

    Ansible简介 xff1a ansible是什么 xff1f ansible是自动化运维工具 自动化运维工具那么多 xff0c 比如 xff08 statstack xff0c puppet xff0c cfengine chef fu
  • Python在字符串中引用变量

    在字符串中加入变量有三种方法 xff1a 1 43 连字符 name 61 39 zhangsan 39 print 39 my name is 39 43 name 结果为 my name is zhangsan 2 字符 name 61
  • 废旧笔记本改造安装黑群晖打造私人NAS超级详细图文教程

    事情是这样的 在我们楼下居住了10年的租客搬走了 xff0c 我感到十分的悲伤 xff01 怀着沉重的心情到楼下去收拾空荡荡的房子 然后 在一个不起眼的柜子里发现了一台被丢弃的废旧联想笔记本 xff01 作为一个合格的垃圾佬 xff0c 怎
  • 二维数组中的查找(C语言实现)

    题目描述 在一个二维数组中 xff0c 每一行都按照从左到右递增的顺序排序 xff0c 每一列都按照从上到下递增的顺序排序 请完成一个函数 xff0c 输入这样的一个二维数组和一个整数 xff0c 判断数组中是否含有该整数 思考 xff1a
  • 变量命名总结

    我在编程的时候发现自己对变量的命名比较混乱 xff0c 有时候命名无厘头也没有统一的规则 xff0c 根本没有辨识性 故今天来对变量命名的技巧和原则做个总结 xff0c 一是分享同大家学习 xff0c 二也是勉励自己 xff0c 编程路漫漫
  • HNU软件能力实训2-21. 新型冠状病毒(COVID19)传播

    写在前面 你好 xff01 欢迎来到我的博客 xff0c 希望我的思路能够帮到你 xff01 问题描述 防控新冠病毒 xff0c 必须时刻引起大家的足够重视 xff0c 特别是人员集中活动场所 xff0c 保持好社交距离 然而 xff0c
  • AtCoder Beginner Contest 216 D - Pair of Balls 大模拟

    D 参考 dfs那里很妙 xff1a 队列i和local成对子 xff0c 一起pop后要继续搜loca xff0c 因为i在退出dfs后会继续在while里判断 xff0c 如果还有又进dfs xff1b span class token
  • CPU调速器Governor说明

    From http android zone it sohu com thread 11841439 1 1 html 现在很内核都会增加新的CPU调速器 xff0c 很多人不知道内核中的CPU调速器有什么用 xff0c 下面给大家详细介绍
  • QT QTreeView 显示文件目录列表,自定义默认展开指定路径

    void Widget updatedate QDirModel model 61 new QDirModel ui gt treeView gt setModel model 设置根目录位置 ui gt treeView gt setRo
  • qt之QDBus简单应用

    一 简介 QtDBus是一个使用D Bus协议进行进程间通信的仅在Unix运行的库 xff0c 是对D Bus底层API的封装实现 QtDBus模块提供了使用Qt信号槽机制扩展的接口 要使用QtDBus模块 xff0c 需要在pro工程文件
  • python 基于you-get库二次开发 网页视频下载

    you get库 You Get是一个很小的命令行实用程序 xff0c 用于从 Web 下载媒体内容 xff08 视频 音频 图像 xff09 以下是您可能想要使用它的原因 xff1a 你喜欢在互联网上的东西 xff0c 只是想下载他们为自
  • python基础——对象、类(创建实例化)

    文章目录 一 编程思想1 面向过程编程2 面向对象编程 二 类 对象总结 一 编程思想 1 面向过程编程 面向过程编程实际上就是将解决问题的全部过程分解为很多步 xff0c 然后一一调用下一步就能解决问题 2 面向对象编程 面向对象编程是将
  • C++开发斗地主(QT)第一篇之数据结构

    斗地主 xff0c 是一种在中国流行的纸牌游戏 游戏最少由3个玩家进行 xff0c 用一副54张牌 xff08 连鬼牌 xff09 xff0c 其中一方为地主 xff0c 其余两家为另一方 xff0c 双方对战 xff0c 先出完牌的一方获
  • python打包exe的方法

    cxfreeze pyinstaller py2exe三种方式 目前网上能获取的免费的Python打包工具主要有三种 xff1a py2exe PyInstaller和cx Freeze 其中PyInstaller最新版只支持Python2
  • 微信3.2.1.121逆向-微信3.2.1.121HOOK接口说明(WeChatHelper.dll)

    为了节省微信HOOK开发时间 xff0c 现将微信HOOK注入DLL接口给大家 xff0c 本接口从3 0 0 47版本开始 xff0c 最新版本3 2 1 112 xff0c 后续会根据自己的时间升级 xff0c 本接口用vc 43 43
  • 微信3.1.0.72逆向-微信3.1.0.72HOOK接口说明(WeChatHelper.dll)-检查微信是否登录

    功能 xff1a 检查微信是否登录Method xff1a GETHttp xff1a http 127 0 0 1 8080 cmdid 61 1返回值 xff1a 文本 xff1a 0或1 xff0c 0表示未登录 xff0c 1表示已
  • 微信3.1.0.72逆向-微信3.1.0.72HOOK接口说明(WeChatHelper.dll)-获取个人信息

    功能 xff1a 获取个人信息Method xff1a GETHttp xff1a http 127 0 0 1 8080 cmdid 61 4返回值 xff1a JSON xff1a 34 cmdid 34 4 34 status 34

随机推荐