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 常用的函数有:
- 获取结果相关函数: result() 。该函数会判断结果是否为可用的,如果不可用则阻塞等待。如果可用则直接把结果返回。
- 设置运行状态函数: cancel() 表示取消,pause() 暂停,Resumes() 恢复,这些函数在 run() 这种模式下无效。
- 获取运行状态函数: isCanceled() 、 isStarted() 、 isFinished() 、 isRunning() 和 isPaused() 。
- 进度信息: 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。