QT C++ QtConcurrent::run 异步任务 简单例子

ops/2025/2/26 11:44:39/

QtConcurrent命名空间提供了高级API,使得无需使用低级线程原语即可编写多线程程序。

QtConcurrent::run‌是Qt框架中用于简化并发编程的一个功能,主要用于在后台线程中异步执行函数或成员函数。其主要用途包括:

  1. 异步执行函数‌:QtConcurrent::run可以在一个单独的线程中运行一个函数,避免耗时操作阻塞当前线程。这对于提升应用程序的响应性和性能非常有帮助‌。
  2. 简化多线程编程‌:通过使用QtConcurrent::run,开发者可以避免直接处理线程的创建、管理和数据同步等复杂操作。这使得编写多线程代码变得更加简单和直观‌。
  3. 利用多核处理器能力‌:QtConcurrent模块能够根据计算机的CPU核心数自动调整运行的线程数目,从而充分利用多核处理器的计算能力‌。

使用方法

使用QtConcurrent::run的基本步骤如下:

  1. 包含必要的头文件‌:在代码中包含#include <QtConcurrent>
  2. 调用QtConcurrent::run‌:使用QtConcurrent::run函数,可以传递一个函数或成员函数及其参数。该函数将在后台线程中异步执行。
  3. 获取结果‌:可以通过QFuture对象获取异步操作的结果。如果需要等待操作完成,可以使用QFutureWatcher来监控和同步结果‌。

以下是例子,在界面上拖放了一个按钮btn1,在按钮Click程序中试验。

1.头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtConcurrent>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_btn1_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

2.cpp文件

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_btn1_clicked()
{
    // QThread::msleep(5000);//这行会卡死界面,不能拖动
    //下面的程序不会卡死界面,放入了lambda函数
    QtConcurrent::run(

                        [ ]()//以下三行是lambda函数,可以用其它函数替代
                      {
                          QThread::msleep(5000);
                      }
                      );

    //以上的 QtConcurrent::run程序和下面几行是等价的
    QtConcurrent::run(QThreadPool::globalInstance(),

                                [ ]()
                      {
                          QThread::msleep(5000);                     

                       }
                      );

}


http://www.ppmy.cn/ops/161400.html

相关文章

深入理解 `Sinks.Empty<Void>` 和 `Mono<Void>`:如何触发完成信号并结合 WebSocket 示例

在响应式编程中&#xff0c;Sinks 是 Project Reactor 提供的一个强大工具&#xff0c;用于手动控制数据流的信号发射。Sinks.Empty<Void> 是一种特殊的 Sinks&#xff0c;它不发射任何数据&#xff0c;仅用于表示完成或错误信号。结合 Mono<Void>&#xff0c;它可…

【linux核心命令】

【linux核心命令】 一级目录1. 使用 gzip 压缩为 .gz 格式知识点代码示例解压操作 2. 使用 bzip2 压缩为 .bz2 格式知识点代码示例解压操作 3. 使用 xz 压缩为 .xz 格式知识点代码示例解压操作 4. 使用 zip 压缩为 .zip 格式知识点代码示例解压操作 5. 使用 tar 结合压缩工具创…

AI绘画(Stable Diffusion)喂饭级教程

AI绘画(Stable Diffusion)喂饭级教程 2022年8月&#xff0c;一款叫Stable Diffusion的AI绘画软件开源发布&#xff0c;从此开启了AIGC在图像上的爆火发展时期 一年后的今天&#xff0c;率先学会SD的人&#xff0c;已经挖掘出了越来越多AI绘画有趣的玩法 从开始的AI美女、线稿…

DeepSeek学习教程 从入门到精通pdf下载:快速上手 DeepSeek

下载链接&#xff1a;DeepSeek从入门到精通(清华大学).pdf 链接: https://pan.baidu.com/s/1Ym0-_x9CrFHFld9UiOdA5A 提取码: 2ebc 一、DeepSeek 简介 DeepSeek 是一款由中国团队开发的高性能大语言模型&#xff0c;具备强大的推理能力和对中文的深刻理解。它广泛应用于智能办…

基于Springboot的小说网站【附源码】

基于Springboot的小说网站 效果如下&#xff1a; 系统主页面 书库信息页面 书籍详情页面 推荐信息页面 小说推荐页面 书库信息页面 小说排行榜页面 系统管理页面 研究背景 随着互联网技术的快速发展&#xff0c;网络文学逐渐成为一种新兴的文学形式&#xff0c;吸引了大量读…

Ollama微调

Ollama是一款开源工具&#xff0c;其目标是简化大语言模型在本地环境的部署和使用。它支持多种流行的开源大语言模型&#xff0c;如 Llama 2、Qwen2.5等。在上一篇文章中我们部署Ollama&#xff0c;并使用简单命令管理Ollama。接下来我们学习Ollama的高级应用。通过Ollama的Mod…

一周学会Flask3 Python Web开发-Jinja2模板访问对象

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 如果渲染模板传的是对象&#xff0c;如果如何来访问呢&#xff1f; 我们看下下面示例&#xff1a; 定义一个Student类 cla…

APP安全测试项总结

一、安装包测试 1.1、关于反编译 目的是为了保护公司的知识产权和安全方面的考虑等&#xff0c;一些程序开发人员会在源码中硬编码一些敏感信息&#xff0c;如密码。而且若程序内部一些设计欠佳的逻辑&#xff0c;也可能隐含漏洞&#xff0c;一旦源码泄漏&#xff0c;安全隐患…