QFuture 使用笔记

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槽函数上,从而处理任务的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值