QFuture
QFuture
代表一个异步操作的结果。它与标准库中的 std::future
类似。当你启动一个异步任务时,这个任务会立即返回一个 QFuture
对象,你可以使用这个对象来查询任务的状态(例如,是否完成),以及获取任务的结果(当任务完成时)。
使用 QFuture
的基本步骤如下:
- 启动一个异步任务,这个任务返回一个
QFuture<T>
对象,其中T
是任务返回值的类型。 - 使用
QFutureWatcher<T>
来监视这个QFuture
对象。QFutureWatcher
提供了信号,比如finished()
,这个信号在任务完成时被触发。 - 通过连接
QFutureWatcher
的信号到你的槽函数,你可以在任务完成时执行一些操作,比如获取结果。
示例代码:
#include <QtConcurrent/QtConcurrentRun>
#include <QFuture>
#include <QFutureWatcher>
void myFunction() {
// 这是将要在后台线程中执行的函数
}
void handleResult() {
// 这里处理异步操作完成后的逻辑
}
int main() {
// 使用 QtConcurrent::run 来启动一个异步任务
QFuture<void> future = QtConcurrent::run(myFunction);
// 使用 QFutureWatcher 来监视这个任务
QFutureWatcher<void> watcher;
QObject::connect(&watcher, &QFutureWatcher<void>::finished, handleResult);
// 开始监视
watcher.setFuture(future);
}
QConcurrent
QConcurrent
提供了一些高级的函数,用于简化并发编程。例如,QtConcurrent::map()
、QtConcurrent::reduce()
和 QtConcurrent::run()
等函数。这些函数可以让你很容易地在多个核心上并行处理数据集合,或者异步运行函数。
QtConcurrent::map()
: 对容器中的每个元素并行应用一个函数。QtConcurrent::reduce()
: 并行处理容器中的元素,并将结果合并。QtConcurrent::run()
: 在新的线程中异步运行函数。
示例代码(使用 QtConcurrent::map
):
#include <QtConcurrent/QtConcurrentMap>
#include <QList>
void myMapFunction(int &element) {
// 对每个元素执行的操作
element *= 2;
}
int main() {
QList<int> list = {1, 2, 3, 4, 5};
// 并行处理列表中的每个元素
QtConcurrent::map(list.begin(), list.end(), myMapFunction);
}
在使用这些并发工具时,需要注意数据共享和同步问题,以避免竞争条件和数据不一致。确保你的并发代码是线程安全的,特别是当多个线程尝试读写共享数据时。