当前位置: 首页 > article >正文

【QT5 多线程示例】异步编程

异步编程

QFuture 是 Qt 并发框架提供的一个异步计算结果的类。它允许你在后台执行任务,并在未来某个时刻获取任务的计算结果。QFuture 通常与 QtConcurrent::runQFutureWatcher 结合使用:

  • QtConcurrent::run 适用于异步执行一个函数并通过 QFutureresult()方法获取结果(调用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


http://www.kler.cn/a/613468.html

相关文章:

  • Java 实现将Word 转换成markdown
  • fyrox 2D和3D游戏的制作
  • uvm factory
  • android studio调试aosp手机userdebug版本无法查看局部变量和参数问题如何解决?
  • 设置github 代理
  • 解决PLC通信会断然后报错的问题
  • 相对位置2d矩阵和kron运算的思考
  • MFC中的窗口线程安全性与CWnd类
  • 从 YOLO11 模型格式导出到TF.js 模型格式 ,环境爬坑,依赖关系已经贴出来了
  • 智慧养老时代:老年人慢性病预防与生活方式优化
  • 【今日EDA行业分析】2025年3月28日
  • 基于扩散模型的光照编辑新突破:IC-Light方法解析与优化
  • DeepSeek大模型应用开发新模式
  • 智能舵机:AI融合下的自动化新纪元
  • ADZS-ICE-2000和AD-ICE2000仿真器在线升级固件
  • Error:Flash Download failed
  • AIGC-广告助手创作智能体完整指令(DeepSeek,豆包,千问,Kimi,GPT)
  • Ubuntu与CentOS操作指令的主要区别详解
  • 【力扣hot100题】(004)盛水最多的容器
  • 【go微服务】如何快速掌握grpc开发