QFuture是Qt框架中用于处理异步任务和获取异步操作结果的一个类。
它通常与QtConcurrent::run一起使用,可以方便地启动一个异步任务,并在任务完成时获取结果。
QFutureWatcher监控结果是否可以获取,future.result()来获取结果。
示例:计算斐波那契数列
假设我们有一个计算斐波那契数列的函数,这个函数可能需要一些时间来完成,因此我们希望在后台线程中运行它,而主线程可以继续执行其他任务。
当计算完成时,我们希望获取结果并更新UI。
1. 定义计算斐波那契数列的函数
#include <QtConcurrent>
#include <QFuture>
#include <QFutureWatcher>
#include <QDebug>
#include <QApplication>
// 计算斐波那契数列的函数
int fibonacci(int n)
{
if (n <= 1)
return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
2. 使用QtConcurrent::run
启动异步任务
使用QtConcurrent::run启动一个异步任务,并获取一个QFuture对象。
QFuture对象可以用来监控任务的执行状态和获取任务的结果。
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 启动异步任务
QFuture<int> future = QtConcurrent::run(fibonacci, 30); // 计算第30个斐波那契数
// 创建一个QFutureWatcher对象来监控任务
QFutureWatcher<int> watcher;
QObject::connect(&watcher,
&QFutureWatcher<int>::finished,
[&]() { //捕获列表:[&],表示捕获当前作用域中的所有变量的引用。
// 任务完成时的槽函数
int result = future.result(); // 获取任务的结果
qDebug() << "Fibonacci result:" << result;
});
// 将QFuture与QFutureWatcher关联
watcher.setFuture(future);
// 主线程继续执行其他任务
qDebug() << "Main thread is running other tasks...";
// 防止程序立即退出
return app.exec();
}