Qt线程之QtConcurrent的介绍

QtConcurrent是Qt框架中用于简化多线程编程的一个模块,它提供了高层次的API来实现并行计算,而不需要开发者直接管理线程的创建、调度和销毁。QtConcurrent主要通过QFuture和QThreadPool来进行并发任务的执行。

使用QtConcurrent的主要优点:

自动利用系统的所有处理器核心,提高计算密集型任务的执行效率。
不需直接操作线程,降低了多线程编程的复杂度和出错概率。
提供了阻塞和非阻塞两种模式,通过QFuture和QFutureWatcher进行结果的获取和回调通知。

QtConcurrent的常用API:

  • QtConcurrent::run():执行一个函数或Lambda表达式,并返回一个QFuture,可以用于获取执行结果或监视执行状态。

  • QtConcurrent::mapped() / mappedReduced():并行地对容器中的所有元素应用一个映射函数,返回映射后的结果集合或聚合结果。

  • QtConcurrent::filtered():过滤容器中的元素,保留满足给定条件的元素。

  • QtConcurrent::blockingMap() / blockingFiltered():阻塞版本的并行映射和过滤操作,直到所有任务完成。

QtConcurrent的使用示例:

#include <QtWidgets>
#include <QtConcurrent>

// 定义一个计算密集型函数
int computeValue(int number) {
    QThread::sleep(1); // 模拟耗时计算
    return number * number;
}

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 使用QtConcurrent::run()并行执行函数
    QList<int> numbersToCompute {1, 2, 3, 4, 5};
    QList<QFuture<int>> futures;
    foreach (int number, numbersToCompute) {
        futures.append(QtConcurrent::run(computeValue, number));
    }

    // 输出结果
    for (auto &future : futures) {
        qDebug() << "Computed result:" << future.result();
    }

    // 或者使用QFutureWatcher进行异步通知
    QFutureWatcher<int> watcher;
    QFuture<int> future = QtConcurrent::run(computeValue, 10);
    connect(&watcher, &QFutureWatcher<int>::finished, [&]() {
        qDebug() << "Computed asynchronously:" << watcher.result();
    });
    watcher.setFuture(future);

    // 运行主事件循环
    return app.exec();
}

#include "main.moc"

在上述示例中,我们首先定义了一个计算平方的函数computeValue()。然后使用QtConcurrent::run()函数将列表中的每个数字传给computeValue()函数,并得到一系列QFuture对象。每个QFuture对象代表一个并行执行的任务,可以使用result()方法获取计算结果,但这通常是在主线程事件循环中异步完成的。

另外,还展示了如何结合QFutureWatcher来异步监听一个计算任务的完成,并在任务完成后打印结果。在实际应用中,QtConcurrent常用于后台执行耗时任务而不阻塞UI线程,保持应用程序的响应性。

相关推荐

  1. Qt线QtConcurrent介绍

    2024-04-03 02:54:01       40 阅读
  2. QT进阶】Qt线与并发QtConcurrent简单介绍

    2024-04-03 02:54:01       40 阅读
  3. Qt开发 | Qt创建线 | Qt并发-QtConcurrent

    2024-04-03 02:54:01       20 阅读
  4. QT进阶】Qt线与并发线和并发简单介绍

    2024-04-03 02:54:01       30 阅读
  5. QTQtConcurrent使用介绍,与std::thread区别

    2024-04-03 02:54:01       40 阅读
  6. Qt线使用

    2024-04-03 02:54:01       36 阅读
  7. QT 线启动

    2024-04-03 02:54:01       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-03 02:54:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-03 02:54:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-03 02:54:01       87 阅读
  4. Python语言-面向对象

    2024-04-03 02:54:01       96 阅读

热门阅读

  1. liblzma/xz漏洞

    2024-04-03 02:54:01       36 阅读
  2. 模板方法模式

    2024-04-03 02:54:01       32 阅读
  3. 我的创作纪念日

    2024-04-03 02:54:01       32 阅读
  4. 2024.4.2

    2024-04-03 02:54:01       36 阅读
  5. 全球化智能组网产品优势

    2024-04-03 02:54:01       36 阅读
  6. pyqt5 无边框窗口拖动

    2024-04-03 02:54:01       33 阅读
  7. 前端开发语言有哪些

    2024-04-03 02:54:01       41 阅读
  8. Spring OAuth2 Resource Server 配置

    2024-04-03 02:54:01       43 阅读
  9. Spring-01

    Spring-01

    2024-04-03 02:54:01      26 阅读
  10. 【nosql-redis】关于持久化的补充

    2024-04-03 02:54:01       34 阅读
  11. 关于投标的细节

    2024-04-03 02:54:01       38 阅读