QThreadPool类和QtConcurrent命名空间

一、QThreadPool类

  QThreadPool管理一组线程。它负责管理和回收单个QThread对象以减少程序中线程创建的开销。每个Qt应用程序都有一个全局的QThreadPool对象,可通过方法globalInstance()获得。为了调用QThreadPool中的一个线程,需要提供一个从QRunnable继承过来的类,并实现其中的run方法。然后创建一个该类的对象,传递给QThreadPool::start()方法。代码片断如下:

[cpp] view plaincopy

  1. class HelloWorldTask : public QRunnable

  2. {

  3. void run()

  4. {

  5. qDebug() << "Hello world from thread" << QThread::currentThread();

  6. }

  7. }
  8. HelloWorldTask *hello = new HelloWorldTask();

  9. // QThreadPool takes ownership and deletes ‘hello‘ automatically

  10. QThreadPool::globalInstance()->start(hello);

默认情况下, QThreadPool自动删除QRunnable对象。使用QRunnable::setAutoDelete()方法可以改变该默认行为。QThreadPool支持在QRunnable::run方法中通过调用tryStart(this)来多次执行相同的QRunnable。当最后一个线程退出run函数后,如果autoDelete启用的话,将删除QRunnable对象。在autoDelete启用的情况下,调用start()方法多次执行同一QRunnable会产生竞态,就避免这样做。

  那些在一定时间内会使用的线程将会过期。默认的过期时间是30秒。可通过setExpiryTimeout()方法来设置。设置一个负数的超时值代表禁用超时机制。方法maxThreadCount()可以查询可使用的最大线程数,你也可以设置最大的线程数。activeThreadCount反应的是当前正在被使用中的线程数个数。reserveThread函数保留某个线程为外部使用,releaseThread释放该线程,这样就可以被再次使用。

二、QtConcurrent命名空间

QtConcurrent命名空间里提供了一些高级API,利用这些API可以编写多线程程序,而不用直接使用比较低级的一些类,如mutext,lock,
waitcondition以及semaphore等。使用QtConcurrent命令空间的API编写的程序会根据处理器的数目自动地调整线程的个数。QtConcurrent包含了用于并行列表处理的函数式编程,包含实现共享内存系统的MapReduce和FilterReduce, 以及管理GUI应用程序中异步计算的类。相关的类说明如下:
































QtConcurrent::map()

appliesa function to every item in a container,
modifying the itemsin-place

QtConcurrent::mapped()

islike map(), except that it returns a new container
with themodifications

QtConcurrent::mappedReduced()

islike mapped(), except that the modified results are
reduced orfolded into a single result.

QtConcurrent::filter()

litems from a container based on the result of a
filter function.

QtConcurrent::filtered()

islike filter(), except that it returns a new
container with thefiltered results

QtConcurrent::filteredReduced()

islike filtered(), except that the filtered results
are reduced orfolded into a single result

QtConcurrent::run()

runsa function in another
thread.

QFutureIterator

allowsiterating through results available via QFuture.

QFutureWatcher

allowsmonitoring a QFuture usingsignals-and-slots.

QFutureSynchronizer

isa convenience class that automatically synchronizes
severalQFutures.

代码实例:

[cpp] view plaincopy

    1. using namespace QtConcurrent;

    2. void hello(QString name)

    3. {

    4. qDebug() << "Hello" << name << "from" << QThread::currentThread();

    5. }

    6. int main(int argc, char **argv)

    7. {

    8. QApplication app(argc, argv);

    9. QFuture<void> f1 = run(hello, QString("Alice"));

    10. QFuture<void> f2 = run(hello, QString("Bob"));

    11. f1.waitForFinished();

    12. f2.waitForFinished();

    13. return app.exec();

    14. }

QThreadPool类和QtConcurrent命名空间,布布扣,bubuko.com

时间: 2025-01-01 10:49:32

QThreadPool类和QtConcurrent命名空间的相关文章

【转】.NET快速查找某个类所在的命名空间

有时候我们从网上copy别人的代码下来,对于某些不熟悉的类,需要添加对某个类的引用时,如何快速找出某个类所在的命名空间呢 例如有如下的一段代码: 现在要添加ConfigurationElement类的引用,那么首先要找出ConfigurationElement类所在的命名空间 操作步骤如下图所示: 找到ConfigurationElement类所在的命名空间后,就可以添加ConfigurationElement类的引用了

【C/C++学院】(4)c++开篇/类和对象/命名空间/类型增强/三目运算符/const专题/引用专题

1.类和对象 成员函数,成员变量,抽象封装的能力. 求圆的面积: #include <iostream> using namespace std; class circle{ private: double m_r;//成员变量 public: void setR(double r)//成员函数 { m_r = r; } double getR() { return m_r; } double getS() { return 3.14*m_r*m_r; } }; void main() { c

Unity 改变类模板-为你的类添加一个命名空间

之前在写代码的时候,就很疑惑为什么创建类的时候.没有命名空间呢?   后来自己的类终于和别人写的类名字有冲突.... 如何修改Unity创建类的模板呢?  找到下面这个文件 然后修改 保存文件在Unity中创建一个新的类(你就会发现创建出来的新类截然不同了)

cocos 给绑定类加一个命名空间

本来以为很简单的,妈的,碰到一大堆的坑.记录一下 步骤: 1:给.h和.cpp加上命名空间. #pragma once #include "cocos2d.h" USING_NS_CC; namespace GameLogic{ class MyClass : public Ref { public: MyClass(void); ~MyClass(void); bool init() { return true; }; CREATE_FUNC(MyClass); int foo(in

面向对象:类的成员---只是特定(类的)命名空间的全局变量(函数)而已

类变量: 生命周期:全生命周期: 作用域: 1)外部可见性:修饰符确定: 2)继承可见性:修饰符确定. 原文地址:https://www.cnblogs.com/feng9exe/p/11972179.html

final,类的自动加载,命名空间

final是干什么的一般是为了防止父类的一个方法被重写如果父类中的方法被声明为 final,则子类无法覆盖该方法.如果一个类被声明为 final,则不能被继承. Note: 属性不能被定义为 final,只有类和方法才能被定义为 final. 类的自动加载类的自动加载是指,在外面的页面中,并不需要去"引入"类文件,但是程序会在需要的时候动态加载需要的类文件. spl_autoload_register() 函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(in

PHP 命名空间 namespace 函数调用 类引用 详解

PHP namespace 命名空间 函数调用 类引用 详细测试分析 本文测试中,假设index.php页面和test.php页面在同一个根目录下,方便加载test.php页面. 前提条件都是在namespace A;下进行测试. namespace A; use B\D, C\E as F; // 函数调用foo();      // 首先尝试调用定义在命名空间"A"中的函数foo()\foo();     // 调用全局空间函数 "foo" my\foo(); 

[Yii2.0] 以Yii 2.0风格加载自定义类或命名空间 [配置使用Yii2 autoloader]

Yii 2.0最显著的特征之一就是引入了命名空间,因此对于自定义类的引入方式也同之前有所不同.这篇文章讨论一下如何利用Yii 2.0的自动加载机制,向系统中引入自定义类和命名空间.本文旨在抛砖引玉,如果有理解不当敬请指正,欢迎大家把自己的方法拿出来分享.我们希望被引入的类应该达成一下两点: 在应用中的任这里输入代码意位置可以使用该类名或命名空间,而不用显式调用require()/include(). 利用Yii的autoloader,仅在类被调用时加载,以遵循Yii按需加载的原则,节省资源. 我

TP框架 命名空间 与第三方类

命名空间 相当于虚拟目录 所有类文件都放在虚拟目录 功能:实现自动加载类 TP框架的命名空间要更复杂 内容=> 命名空间中定义和使用 都用\1初始命名空间 相当于 根目录 如:Library文件夹 初始命名空间下包含根命名空间 根命名空间:1.LIbrary目录下面的所有 文件夹2.程序目录下模块名 定义命名空间 写法:从根开始写,写到本类的该目录下为止使用命名空间 从根开始写,写到类名为止 TP框架下每个类文件都要加命名空间,namespace ########################