1. QFuture详解
概念 :
QFuture是Qt库中的一个类,它代表了一个异步计算的结果。当你启动一个耗时的操作,如文件读取、网络请求或复杂的计算任务时,你不希望这些操作阻塞主线程,从而影响用户界面的响应性。QFuture就是用来处理这种异步操作的,它允许你在任务完成后获取结果,而不必阻塞主线程。
用途:
- 异步执行任务,避免阻塞UI线程。
- 监控任务的进度和状态。
- 获取异步任务的结果。
主要特点:
- QFuture是模板类,可以处理不同类型的结果。
- 提供了查询任务状态(如是否开始、是否完成、是否取消等)的方法。
- 可以与QFutureWatcher结合使用,通过信号和槽机制来监控任务的进度和结果。
2. 信号和槽列表在QFuture中的作用和用法
在Qt中,信号和槽是一种对象间通信的机制。当某个特定事件发生时,一个对象可以发射(emit)一个信号,而另一个对象的槽(slot)可以被这个信号触发。
对于QFuture和相关的QFutureWatcher类,这种机制尤为重要,因为它允许你在异步任务的不同阶段执行特定的操作。
主要信号:
- started(): 当异步任务开始时发射。
- finished(): 当异步任务完成时发射。
- progressValueChanged(int progress): 当任务进度改变时发射,携带当前进度值。
- progressRangeChanged(int minimum, int maximum): 当任务的进度范围改变时发射。
- progressTextChanged(const QString &progressText): 当任务的进度文本改变时发射。
槽的用法 :
你可以将上述信号连接到任何你定义的槽函数上,以便在任务的不同阶段执行自定义的操作。例如,你可以在任务开始时显示一个加载动画,在任务完成时隐藏加载动画并显示结果。
3. 示例代码
下面是一个简单的示例,展示了如何使用QFuture和信号槽机制来异步执行一个函数,并在任务完成时更新UI。
#include <QtConcurrent>
#include <QFutureWatcher>
#include <QObject>
#include <QDebug>
// 假设我们有一个耗时的函数
QString longRunningFunction(int n) {
QThread::sleep(n); // 模拟耗时操作
return QString("Completed after %1 seconds").arg(n);
}
class MyObject : public QObject {
Q_OBJECT
public:
MyObject() {
connect(&watcher, &QFutureWatcher<QString>::finished
, this, &MyObject::handleFinished);
}
void startLongRunningTask(int seconds) {
future = QtConcurrent::run(longRunningFunction, seconds);
watcher.setFuture(future);
}
private slots:
void handleFinished() {
qDebug() << "Task finished, result:" << watcher.result();
}
private:
QFuture<QString> future;
QFutureWatcher<QString> watcher;
};
int main() {
MyObject obj;
obj.startLongRunningTask(5); // 启动一个耗时5秒的任务
// ... 其他代码,如事件循环等 ...
}
在这个示例中,MyObject类使用QFuture和QFutureWatcher来异步执行longRunningFunction函数。当任务完成时,QFutureWatcher会发射finished信号,这个信号被连接到handleFinished槽函数上,从而处理任务的结果。