【QT5 多线程示例】异步编程
异步编程
QFuture
是 Qt 并发框架提供的一个异步计算结果的类。它允许你在后台执行任务,并在未来某个时刻获取任务的计算结果。QFuture
通常与 QtConcurrent::run
或 QFutureWatcher
结合使用:
-
QtConcurrent::run
适用于异步执行一个函数并通过QFuture
的result()
方法获取结果(调用result()
会阻塞当前线程,直到获取结果)。 -
QFutureWatcher
允许监听QFuture
的完成状态。如果你不想阻塞线程,而是希望在任务完成后收到通知,可以使用QFutureWatcher
和信号槽机制获取结果。
使用 QtConcurrent 执行异步任务
https://github.com/BinaryAI-1024/QtStudy/tree/master/thread/concurrent
#include <QCoreApplication>
#include <QtConcurrent>
#include <QDebug>
#include <QThread>
// 模拟耗时任务
int heavyTask(int value) {
QThread::sleep(2); // 模拟耗时任务
return value * 2;
}
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
// 使用 QtConcurrent::run 启动异步任务
QFuture<int> future = QtConcurrent::run(heavyTask, 10);
// 这里可以执行其他任务,不会阻塞主线程
qDebug() << "Main thread is running...";
// 获取结果(阻塞,直到任务完成)
int result = future.result();
qDebug() << "Async result:" << result;
return 0;
}
运行结果:
Main thread is running...
(2秒后)
Async result: 20
QtConcurrent::run(heavyTask, 10)
启动一个后台线程执行 heavyTask(10)
,future.result()
阻塞并等待任务完成,然后返回计算结果。
注意:项目文件中应该添加:QT += concurrent
使用 QFutureWatcher监听异步任务完成
https://github.com/BinaryAI-1024/QtStudy/tree/master/thread/futureWatcher
#include <QCoreApplication>
#include <QtConcurrent>
#include <QFuture>
#include <QFutureWatcher>
#include <QDebug>
int heavyTask(int value) {
QThread::sleep(2); // 模拟耗时任务
return value * 2;
}
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
QFutureWatcher<int> watcher;
// 监听任务完成信号
QObject::connect(&watcher, &QFutureWatcher<int>::finished, [&]() {
qDebug() << "Async result:" << watcher.future().result();
QCoreApplication::quit(); // 任务完成后退出应用
});
// 启动异步任务
QFuture<int> future = QtConcurrent::run(heavyTask, 10);
watcher.setFuture(future); // 关联 watcher
qDebug() << "Main thread is running...";
return app.exec(); // 进入事件循环
}
运行结果:
Main thread is running...
(2秒后)
Async result: 20
QFutureWatcher
监听 QFuture
,当任务完成时触发 finished()
信号。 QObject::connect
绑定该信号,在异步任务完成后自动获取结果。
注意:项目文件中应该添加:QT += concurrent