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

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); } ); }

相关推荐
sulikey16 小时前
深入讲解:什么是 RAII(资源获取即初始化)——原理、实现、面试常考点与实战示例
c++·面试·智能指针·raii·shared_ptr·auto_ptr·资源获取即初始化
q***d17316 小时前
Rust在网络中的协议栈
开发语言·网络·rust
艾莉丝努力练剑16 小时前
【Git:多人协作】Git多人协作实战:从同分支到多分支工作流
服务器·c++·人工智能·git·gitee·centos·项目管理
星释16 小时前
Rust 练习册 88:OCR Numbers与光学字符识别
开发语言·后端·rust
一生要强的ymy16 小时前
Polar PHP是世界上最好的语言(困难)
开发语言·php
我命由我1234517 小时前
Java NIO 编程 - NIO Echo Server、NIO Client(NIO 异步客户端、NIO Selector 异步客户端)
java·开发语言·网络·java-ee·intellij-idea·intellij idea·nio
前端炒粉18 小时前
35.LRU 缓存
开发语言·javascript·数据结构·算法·缓存·js
星释19 小时前
Rust 练习册 75:ETL与数据转换
开发语言·rust·etl
happyjoey21719 小时前
使用Qt自带的Maintenance Tool将Qt6.9升级为QT6.10
开发语言·qt
p***h6431 天前
JavaScript在Node.js中的异步编程
开发语言·javascript·node.js