首页 > 其他分享 >Qt线程使用方法三:QtConcurrent::run

Qt线程使用方法三:QtConcurrent::run

时间:2024-05-23 22:08:56浏览次数:11  
标签:include run Qt QFutureWatcher QtConcurrent 线程 QFuture

在Qt中,QFuture和QtConcurrent模块提供了一种简便的方式来执行并行任务。QFuture用于接收异步操作的结果,

而QtConcurrent提供了一些函数来启动异步操作。这种方法不需要直接使用QThread,而是通过高级API来管理线程池和任务。 

步骤 1: 包含必要的头文件

 首先,确保你的项目文件(如.pro文件)中包含了对应的模块:
QT += concurrent

然后,在你的代码中包含必要的头文件:

 
#include <QtConcurrent>
#include <QFuture>
#include <QFutureWatcher>
#include <QDebug>

步骤 2: 使用QtConcurrent运行任务

 你可以使用QtConcurrent::run来启动一个并行任务。这个函数会将任务提交到Qt全局线程池中执行。  
void myFunction(int param) {
    qDebug() << "Processing" << param;
    QThread::sleep(1);  // 模拟耗时操作
}

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

    // 启动任务
    QFuture<void> future = QtConcurrent::run(myFunction, 42);

    // 使用QFutureWatcher来监视任务的完成
    QFutureWatcher<void> watcher;
    QObject::connect(&watcher, &QFutureWatcher<void>::finished, [&]() {
        qDebug() << "Task completed!";
        app.quit();
    });

    watcher.setFuture(future);

    return app.exec();
}

 

步骤 3: 处理返回值

 如果你的函数有返回值,QFuture可以用来接收这个返回值。例如,如果你有一个返回整数的函数:
int computeValue() {
    QThread::sleep(2);  // 模拟耗时操作
    return 123;
}

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

    QFuture<int> future = QtConcurrent::run(computeValue);

    QFutureWatcher<int> watcher;
    QObject::connect(&watcher, &QFutureWatcher<int>::finished, [&]() {
        qDebug() << "Computed value:" << future.result();
        app.quit();
    });

    watcher.setFuture(future);

    return app.exec();
}

 

注意事项 

  • 线程安全:确保你传递给QtConcurrent::run的函数是线程安全的。 
  • 资源管理:QFuture和QFutureWatcher会自动管理资源,但你需要确保它们在任务完成后不会过早销毁。 
  • 错误处理:QFuture不直接支持异常处理。如果你的任务可能会抛出异常,你需要在任务内部处理这些异常。
 使用QFuture和QtConcurrent可以简化多线程编程,使得代码更加简洁,同时自动利用多核处理器的优势。

标签:include,run,Qt,QFutureWatcher,QtConcurrent,线程,QFuture
From: https://www.cnblogs.com/onlyou13/p/18209456

相关文章

  • Qt线程使用方法二:派生QThread
    在Qt中,从QThread派生一个子类并在构造函数中传入需要执行的方法,然后在线程中运行该方法并通知执行结果,是一种常见的多线程处理模式。以下是如何实现这一功能的步骤和示例代码: 步骤 1: 定义线程类 首先,定义一个从QThread派生的线程类。在这个类中,你可以定义一个函数指针或者......
  • Qt线程使用方法一:moveToThread
    在Qt中创建线程去执行耗时任务,并在任务完成后通知调用方(无论成功还是失败),可以通过使用QThread和信号槽机制来实现。以下是一个简单的示例,展示如何创建一个线程来执行任务,并在任务完成后发送信号。步骤 1: 定义工作类首先,定义一个工作类,该类将在单独的线程中执行任务。这个类......
  • 关于QT的头文件相互包含的问题
    就是我有两个代码,head_test.cpp,head_test.h和head_test2.cpp,head_test2.h。要互相调用对方的类。为了方便看下面我就用A代表head_test,B代表head_test21.head_test.h2.head_test.cpp3.head_test2.h4.head_test2.cpp这两天我在查网上的资料,基本上都是说,需要在头文件中......
  • QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
     Qt具有跨平台的特性,即Qt数据结构与算法库本身跨平台和编译脚本(.pro)跨平台。在同时具有Windows下和Linux开发的需求时,最好的建议是使用QtCreator来开发,虽然也可以使用其他的IDE配合CMake等方式,但使用QtCreator更加方便,并且操作环境完全一致。QtCreator支持Windows、Linux、M......
  • Linux command-not in runoob
    command:nl1.命令格式nl[option][file]2.命令参数-b:指定行号指定的方式,主要有两种:-ba:表示不论是否为空行,也同样列出行号(类似cat-n);-bt:-n:列出行号表示的方法,主要有三种:-nln:行号在萤幕的最左方显示,-nrn:行号在自己栏位的最右方显示,且不加0;-nrz:行......
  • uniapp中使用mqtt.js的踩坑记录
    最近在uniapp的vue3.0版本中使用mqtt.js库时遇到了一些坑,经过亲身踩坑,现在把实际能够实现在uniapp的app端能够使用mqtt.js的方法步骤记录如下:一、安装首先安装mqtt.js,建议使用较为稳定的3.0.0版本:[email protected]二、引入mqtt.jsimportmqttfrom'mqtt/dist/mqtt.......
  • QGIS开发笔记(二):Windows安装版二次开发环境搭建(上):安装OSGeo4W运行依赖其Qt的基础环境De
    前言  使用QGis的目的是进行二次开发,或者说是融入我们的应用(无人车、无人船、无人机),本片描述搭建QGis二次基础开发环境,由于实在是太长了,进行了分篇:上半部分:主要是安装好后,使用QtCreator可以使用QGIs的apps下的Qt使用对应的编译器编译不带qgis的空工程。下半部分:在上半......
  • Run Llama 3 Locally with Ollama and Open WebUI
    Ollama3installhttps://dev.to/timesurgelabs/how-to-run-llama-3-locally-with-ollama-and-open-webui-297dhttps://medium.com/@blackhorseya/running-llama-3-model-with-nvidia-gpu-using-ollama-docker-on-rhel-9-0504aeb1c924DockerGPUAcceleratehttps://docs.do......
  • 【老鼠看不懂的数据结构】FHQTreap 初识
    Treap弱平衡的随机性很强的老鼠看不懂的平衡树Q:为什么叫Treap?A:看看二叉搜索树(BST)和堆(Heap),组合起来就是Treap其中,二叉搜索树的性质是:左子节点的值(val)比父节点小右子节点的值(val)比父节点大如果这些节点的值都一样,这棵树就会退化成一颗(?)链。对,我知道你在想......
  • 3562-Qt工程编译说明、GPU核心使用说明
     ......