Qt多线程常见方法(二)
Qt多线程常见方法(二)
Qt高级线程的使用方法
1. Qt并行库模块QtConcurrent
QtConcurrent是Qt框架提供的一个用于简化并行编程的模块,它提供了一组高级接口和工具,用于在多线程环境中执行并行操作。
原理
-
任务分发: QtConcurrent会将需要执行的任务分发给一个或多个线程,以实现并行执行。
-
线程管理: QtConcurrent会根据需要创建线程,并根据系统负载情况动态调整线程数量。
-
任务结果收集: QtConcurrent可以管理并发任务的结果,使得在主线程中可以轻松访问任务的执行结果。
适用情况
-
并行算法和操作: QtConcurrent适用于需要并行执行的算法和操作,例如遍历、排序、过滤等。
-
异步任务: 如果有一些耗时的操作,但又不希望阻塞主线程,可以使用QtConcurrent来异步执行这些任务,保持界面的响应性。
-
数据处理: 当需要对大量数据进行处理时,可以使用QtConcurrent来加速处理过程,提高程序的性能。
-
简化多线程编程: QtConcurrent提供了一组高级接口,可以简化多线程编程,减少线程管理的复杂性。
用法
- 使用QtConcurrent::run()执行函数
#include <QtConcurrent/QtConcurrent>
// 定义一个函数
void myFunction(int value) {
// 函数逻辑
}
// 在新线程中执行函数
QtConcurrent::run(myFunction, 42);
2.使用QtConcurrent::mapped()和QtConcurrent::filtered()执行映射和过滤操作:
#include <QtConcurrent/QtConcurrent>
#include <QtCore/QtAlgorithms>
// 定义一个函数对象
struct MyFunctionObject {
int operator()(int value) {
// 函数对象逻辑
return value * 2;
}
};
// 定义一个容器
QVector<int> values;
// 向容器中添加数据...
// 并行执行映射操作
QVector<int> mappedValues = QtConcurrent::mapped(values, MyFunctionObject());
// 并行执行过滤操作
QVector<int> filteredValues = QtConcurrent::filtered(values, isEven);
2. QFuture和QFutureWatcher
QFuture 和 QFutureWatcher 是 Qt 中用于异步执行任务并监视任务执行状态的类。
原理
- QFuture:表示一个未来可能会产生结果的任务,可以在后台线程中执行。任务执行完成后,可以通过 QFuture 获取任务的结果。
- QFutureWatcher:用于监视 QFuture 的执行状态,包括任务是否完成、是否产生了结果等。当任务完成时,QFutureWatcher 会发出相应的信号,通知应用程序。
适用情况
- 异步任务:当有耗时的任务需要在后台线程中执行时,可以使用 QFuture 和 QFutureWatcher 来异步执行任务,并在任务完成后获取结果。
- UI响应性:通过将耗时任务放在后台线程中执行,可以保持 UI 的响应性,避免任务阻塞主线程导致界面卡顿。
用法
#include <QtConcurrent/QtConcurrent>
#include <QFutureWatcher>
// 定义一个耗时任务函数
int lengthyTask() {
// 模拟耗时操作
QThread::sleep(5);
return 42;
}
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// 创建 QFutureWatcher 对象
QFutureWatcher<int> watcher;
// 连接任务完成信号
QObject::connect(&watcher, &QFutureWatcher<int>::finished, [&]() {
// 任务完成时的处理逻辑
qDebug() << "Task completed! Result:" << watcher.result();
watcher.deleteLater(); // 清理 QFutureWatcher 对象
});
// 启动异步任务
QFuture<int> future = QtConcurrent::run(lengthyTask);
watcher.setFuture(future);
// 等待任务完成
watcher.waitForFinished();
return app.exec();
}
在上面的示例中,lengthyTask() 函数模拟了一个耗时操作,QtConcurrent::run() 将该函数放在后台线程中执行。QFutureWatcher 对象用于监视任务的执行状态,当任务完成时,会发出 finished 信号,我们通过连接这个信号来处理任务完成时的逻辑。
注意事项
- 在连接 finished 信号时,需要确保 QFutureWatcher 对象的生命周期覆盖到信号处理的时间段,以避免访问已销毁的对象。
- 在任务执行完成后,记得清理 QFutureWatcher 对象,以释放资源。