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

devtools/2025/2/26 22:22:02/

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/devtools/162899.html

相关文章

单片机的串口(USART)

Tx - 数据的发送引脚&#xff0c;Rx - 数据的接受引脚。 串口的数据帧格式 空闲状态高电平&#xff0c;起始位低电平&#xff0c;数据位有8位校验位&#xff0c;9位校验位&#xff0c;停止位是高电平保持一位或者半位&#xff0c;又或者两位的状态。 8位无校验位传输一个字节…

蓝桥杯训练 补题

P8605 [蓝桥杯 2013] 网络寻路 这个题之前写过&#xff0c;但是后面数据加强了&#xff0c;直接dfs是会超时的&#xff0c;这是就要用另外的解法了&#xff0c;题目要求只要三条边&#xff0c;那么就可以找中间的边&#xff0c;对于每组边&#xff0c;把他们作为中间边&#xf…

如何禁用uniapp,vue页面下拉刷新功能

在小程序开发中&#xff0c;enablePullDownRefresh 是一个常用的配置项&#xff0c;用来控制页面是否允许下拉刷新。但是&#xff0c;有时即使在 pages.json 中将其设置为 false&#xff0c;下拉刷新依然可能未被完全禁用。 1. enablePullDownRefresh: false 配置无效 enable…

Postman学习总结

1、基本操作&#xff1a; 【2023全网最牛教程】10分钟快速上手Postman&#xff08;建议收藏&#xff09;_macbook postman打开慢-CSDN博客 接口测试—Postman详解-CSDN博客 新手如何使用postman&#xff08;新手使用&#xff0c;简单明了&#xff09;_postman教程-CSDN博客 …

【无标题】网络安全公钥密码体制

第一节 网络安全 概述 一、基本概念 网络安全通信所需要的基本属性“ 机密性&#xff1b;消息完整性&#xff1b;可访问性与可用性&#xff1b;身份认证。 二、网络安全威胁 窃听&#xff1b;插入&#xff1b;假冒&#xff1b;劫持&#xff1b;拒绝服务Dos和分布式拒绝服务…

上证50股指期货一手多少钱?

先说结论&#xff0c;一手上证50股指期货的钱数&#xff0c;主要看两个东西&#xff1a;指数点位 和 保证金比例。 &#xff08;一&#xff09;合约金额怎么算&#xff1f; 上证50股指期货的规则是&#xff1a;每一点指数值300块钱。比如&#xff0c;现在上证50指数是2700点&…

804 唯一摩斯密码词

国际摩尔斯密码定义一种标准编码方式&#xff0c;将每个字母对应于一个由一系列点和短线组成的字符串&#xff0c; 比如: a 对应 ".-" &#xff0c;b 对应 "-..." &#xff0c;c 对应 "-.-." &#xff0c;以此类推。 为了方便&#xff0c;所有…

JavaWeb基础专项复习6——AJAX

系列文章目录 1、JavaWeb基础专项复习1——XML文件-CSDN博客 2、JavaWeb基础专项复习2——JSP文件-CSDN博客 3、JavaWeb基础专项复习2——Servlet相关知识-CSDN博客 4、JavaWeb基础专项复习4——会话对象Session and Cookie-CSDN博客 5、JavaWeb基础专项复习5——请求对象…