QtConcurrent多线程

1. run()函数

Concurrent::run() 表示在一个单独的线程中执行函数。

它的基本原型如下:
QFuture QtConcurrent::run(QThreadPool *pool, Function function, …)

  • 参数 function : 表示要在线程中执行的函数。
  • 参数 pool :线程池。表示从线程池中获取一个线程来执行该函数。
  • 注意 :函数可能不会立即执行;一旦线程池中的线程有可用的线程时,才会被执行。
  • 返回值 :返回一个 QFuture<T> 对象

2. QFuture

QFuture 用来表示异步计算的结果。 QFuture 可以表示一段时间之后的异步计算的结果,使用它可以获取和控制当前计算的状态并获取计算完毕之后的结果。
下面是一个简单的例子:

extern int func(void);
int func(void) {
	// do some thing
}

QFuture<int> future = QtConcurrent::run(func);
int result = future.result();  // 该函数会阻塞等待线程执行func的计算结果返回

QFuture 常用的函数有:

  1. 获取结果相关函数: result() 。该函数会判断结果是否为可用的,如果不可用则阻塞等待。如果可用则直接把结果返回。
  2. 设置运行状态函数: cancel() 表示取消,pause() 暂停,Resumes() 恢复,这些函数在 run() 这种模式下无效。
  3. 获取运行状态函数: isCanceled() 、 isStarted() 、 isFinished() 、 isRunning() 和 isPaused() 。
  4. 进度信息: progressValue() 、progressMinimum() 、progressMaximum() 和 progressText() ,在 run() 模式下,这些值并没有正真的意义。waitForFinished() 会阻塞等待计算的完成,直到结果为可用的状态。

这里要注意的是,QFuture<T> 模板 T 这个类型,需要有默认构造和拷贝构造。同时 QFuture 是一个基于引用计数的轻量级的类。
我们通常想要通过信号和槽的函数,异步的监控这些状态信息。这就需要 QFutureWatcher 这个类。

3. QFutureWatcher

QFutureWatcher 使我们通过信号和槽的方式,监控 QFuture 对象。
下面是一个示例:

// Instantiate the objects and connect to the finished signal.
MyClass myObject;
QFutureWatcher<int> watcher;
connect(&watcher, SIGNAL(finished()), &myObject, SLOT(handleFinished()));

// Start the computation.
QFuture<int> future = QtConcurrent::run(...);
watcher.setFuture(future);

函数 setFuture 表示设置被监控的 QFuture 对象,为了避免我们设置后不能及时的收到 QFuture 对象发送的信号,可以在执行 run 之前设置信号和槽的连接。
当 QFuture 对象的结果可用的时候, finished 信号会被 QFutureWatcher 发送。

4、QFutureSynchronizer

QFutureWatcher类似,只是提供的功能更少一些。

void someFunction()
 {
     QFutureSynchronizer<void> synchronizer;

     ...

     synchronizer.addFuture(QtConcurrent::run(anotherFunction));
     synchronizer.addFuture(QtConcurrent::map(list, mapFunction));

     return; // QFutureSynchronizer waits for all futures to finish
 }

waitForFinished() 可以用setCancelOnWait() 函数来代替。.调用 setCancelOnWait(true) 将会在等待结束之前取消所有的FUTURE。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值