qt-C++笔记之使用QtConcurrent异步地执行槽函数中的内容,使其不阻塞主界面

qt-C++笔记之使用QtConcurrent异步地执行槽函数中的内容,使其不阻塞主界面

code review!

文章目录

  • qt-C++笔记之使用QtConcurrent异步地执行槽函数中的内容,使其不阻塞主界面
    • 1.QtConcurrent::run基本用法
      • 基本用法
        • 启动一个全局函数或静态成员函数
        • 使用 Lambda 表达式
        • 启动类的成员函数
      • 指定执行的线程
      • 使用返回值
      • 注意事项
    • 2.代码1:槽函数定义——>QtConcurrent::run(Lambda表达式)——>全局函数
    • 3.代码2:槽函数定义——>QtConcurrent::run(Lambda表达式)——>全局函数
    • 4.代码3:槽函数定义——>QtConcurrent::run(this,&类名::成员函数)
    • 5.代码4:槽函数定义——>QtConcurrent::run(Lambda表达式[this]{执行内容})
    • 6.上述例程的test.pro

1.QtConcurrent::run基本用法

QtConcurrent::run 是 Qt 框架中一个非常有用的函数,用于在不同的线程中异步执行函数或者成员函数,这样可以避免阻塞主线程,提高应用程序的响应性。这个函数是 Qt 并发编程模块的一部分,使用前需要包含头文件 <QtConcurrent>

基本用法

QtConcurrent::run 可以启动任何可调用的对象,包括普通函数、类成员函数以及 lambda 表达式。它返回一个 QFuture<T> 对象,你可以使用这个对象来查询任务的状态或结果。

启动一个全局函数或静态成员函数
#include <QtConcurrent>void myFunction(int arg1, double arg2) {// 处理函数
}int main() {QFuture<void> future = QtConcurrent::run(myFunction, 1, 2.0);
}
使用 Lambda 表达式
#include <QtConcurrent>int main() {auto lambda = [] (int value) {// 一些处理};QFuture<void> future = QtConcurrent::run(lambda, 42);
}
启动类的成员函数
#include <QtConcurrent>class MyClass {
public:void myMemberFunction(int arg) {// 处理函数}
};int main() {MyClass myObject;QFuture<void> future = QtConcurrent::run(&MyClass::myMemberFunction, &myObject, 123);
}

指定执行的线程

默认情况下,QtConcurrent::run 使用全局线程池来执行任务。但是,你也可以指定一个自定义的 QThreadPool 来运行任务。

#include <QtConcurrent>void myFunction() {// 函数实现
}int main() {QThreadPool pool;pool.setMaxThreadCount(2);  // 设置线程池大小QFuture<void> future = QtConcurrent::run(&pool, myFunction);future.waitForFinished();  // 等待任务完成
}

使用返回值

如果被调用的函数有返回值,你可以通过 QFuture<T> 来获取这个值。

#include <QtConcurrent>int computeValue() {return 42;
}int main() {QFuture<int> future = QtConcurrent::run(computeValue);int result = future.result();  // 获取结果return result;
}

注意事项

  1. 线程安全:确保你传递给 QtConcurrent::run 的函数是线程安全的,特别是当你在多个线程中访问共享数据时。
  2. 资源管理:当你在多线程环境中工作时,需要特别注意资源管理和数据同步。
  3. 生命周期管理:确保所有 QtConcurrent::run 使用的对象在任务执行期间保持有效。

2.代码1:槽函数定义——>QtConcurrent::run(Lambda表达式)——>全局函数

运行
在这里插入图片描述

#include <QApplication>
#include <QPushButton>
#include <QMainWindow>
#include <QtConcurrent>// 假设这是一个耗时的函数
void heavyFunction() {// 模拟耗时操作,例如计算或数据处理for (int i = 0; i < 100000000; i++) {double x = i * 0.001;x = x / 2.0;}
}class MainWindow : public QMainWindow {Q_OBJECT
public:MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {// 创建按钮QPushButton *pushButton = new QPushButton("Run Heavy Function", this);pushButton->setGeometry(100, 50, 200, 50);// 连接按钮的点击信号到相应的槽connect(pushButton, &QPushButton::clicked, this, &MainWindow::on_pushButton_clicked);}public slots:void on_pushButton_clicked() {// 使用 QtConcurrent 运行重耗时函数QtConcurrent::run([=] {heavyFunction();});}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);MainWindow w;w.show();return app.exec();
}#include "main.moc"  // 确保包含 moc 文件以处理 QObject 的元信息

3.代码2:槽函数定义——>QtConcurrent::run(Lambda表达式)——>全局函数

运行
在这里插入图片描述

#include <QApplication>
#include <QPushButton>
#include <QtConcurrent>// 假设的耗时函数
void heavyFunction() {// 模拟耗时操作,例如进行复杂计算for (int i = 0; i < 1000000; ++i) {// 模拟计算}
}int main(int argc, char *argv[]) {QApplication app(argc, argv);QPushButton button("Run Heavy Function");button.resize(200, 50);button.show();// 连接按钮的点击信号到一个 lambda 表达式,该表达式异步执行 heavyFunctionQObject::connect(&button, &QPushButton::clicked, []() {QtConcurrent::run([]{heavyFunction();});});return app.exec();
}

4.代码3:槽函数定义——>QtConcurrent::run(this,&类名::成员函数)

运行
在这里插入图片描述

#include <QApplication>
#include <QMainWindow>
#include <QPushButton>
#include <QMutex>
#include <QtConcurrent>class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {// 设置主窗口的大小this->setFixedSize(400, 300);// 创建一个按钮,并设置其显示文本和父窗口QPushButton *button = new QPushButton("Run Heavy Function", this);button->setGeometry(100, 100, 200, 50);// 连接按钮的点击信号到相应的槽函数connect(button, &QPushButton::clicked, this, &MainWindow::on_pushButton_clicked);}~MainWindow() {}private slots:void on_pushButton_clicked() {QtConcurrent::run(this, &MainWindow::heavyFunction);}private:void heavyFunction() {// 锁定互斥锁以安全访问成员变量mutex.lock();// 操作共享数据sharedData++;mutex.unlock();// 执行其他耗时操作}int sharedData = 0;  // 一个示例成员变量QMutex mutex;        // 互斥锁保护成员变量
};#include "main.moc"int main(int argc, char *argv[]) {QApplication app(argc, argv);MainWindow w;w.show();return app.exec();
}

5.代码4:槽函数定义——>QtConcurrent::run(Lambda表达式[this]{执行内容})

运行
在这里插入图片描述

#include <QApplication>
#include <QMainWindow>
#include <QPushButton>
#include <QMutex>
#include <QtConcurrent>class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {// 设置主窗口的大小this->setFixedSize(400, 300);// 创建一个按钮,并设置其显示文本和父窗口QPushButton *button = new QPushButton("Run Heavy Function", this);button->setGeometry(100, 100, 200, 50);// 连接按钮的点击信号到相应的槽函数connect(button, &QPushButton::clicked, this, &MainWindow::on_pushButton_clicked);}~MainWindow() {}private slots:void on_pushButton_clicked() {// 使用 lambda 表达式在后台线程上运行代码QtConcurrent::run([this] {// 锁定互斥锁以安全访问成员变量mutex.lock();// 操作共享数据sharedData++;mutex.unlock();// 执行其他耗时操作});}
private:int sharedData = 0;  // 一个示例成员变量QMutex mutex;        // 互斥锁保护成员变量
};#include "main.moc"int main(int argc, char *argv[]) {QApplication app(argc, argv);MainWindow w;w.show();return app.exec();
}

6.上述例程的test.pro

TEMPLATE = app
TARGET = qt_test
INCLUDEPATH += .# Add more modules by appending them here
QT += core gui concurrentgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsSOURCES += main.cppHEADERS +=

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/841310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS--锁的学习

iOS--锁的学习 锁的介绍线程安全 锁的分类自旋锁和互斥锁OSSpinLockos_unfair_lockpthread_mutexpthread_mutex的属性 NSLockNSRecursiveLockNSConditionNSConditionLockdispatch_semaphoredispatch_queuesynchronizedatomicpthread_rwlock&#xff1a;读写锁dispatch_barrier_…

摸鱼大数据——Hive基础理论知识——Hive基础架构

1、Hive和MapReduce的关系 1- 用户在Hive上编写数据分析的SQL语句&#xff0c;然后再通过Hive将SQL语句翻译成MapReduce程序代码&#xff0c;最后提交到Yarn集群上进行运行 2- 大家可以将Hive理解成有道词典&#xff0c;帮助你翻译英文 2、Hive架构 用户接口: 包括 CLI、JDBC/…

武汉大学化学与分子科学学院雷爱义教授

国务院政府特殊津贴专家(2020)&#xff0c;第四届Yoshida Prize(吉田奖&#xff0c;2019)&#xff0c;国家“万人计划”科技创新领军人才(2017)&#xff0c;国家中青年科技创新领军人才(2015)&#xff0c;英国皇家化学学会会士(2015)&#xff0c;长江学者特聘教授(2014)&#x…

【数字移动通信】期末突击

文章目录 复习题一.简答题1、常用的移动通信系统有哪些?2、分别列出1G,2G,3G,4G的典型系统或标准&#xff1f;3、移动通信信道的基本特征&#xff1f;4、电波传播预测模型是用来计算什么量的&#xff0c;在选择传播预测模型时&#xff0c;主要考虑哪些因素&#xff1f;5、什么…

Java+Swing+Mysql实现飞机订票系统

一、系统介绍 1.开发环境 操作系统&#xff1a;Win10 开发工具 &#xff1a;Eclipse2021 JDK版本&#xff1a;jdk1.8 数据库&#xff1a;Mysql8.0 2.技术选型 JavaSwingMysql 3.功能模块 4.数据库设计 1.用户表&#xff08;users&#xff09; 字段名称 类型 记录内容…

脑机接口习题

9-12章习题 填空题 EEG电极分为 主动电极 和 被动电极 &#xff0c;其中 被动电极 直接与放大器连接&#xff0c; 主动电极 包含一个1~10倍的前置放大。除抗混淆滤波器&#xff0c;放大系统也包含由电阻器、电容器构成的模拟滤波器&#xff0c;把信号频率内容限制在一个特定的…

B树与B+树区别

B树和B树是常见的数据库索引结构&#xff0c;都具有相较于二叉树层级较少&#xff0c;查找效率高的特点&#xff0c;它们之间有以下几个主要区别&#xff1a; 1.节点存储数据的方式不同 B树的叶子结点和非叶子节点都会存储数据&#xff0c;指针和数据共同保存在同一节点中B树…

SpringMVC相关知识集锦----1

一、springMVC框架的了解 springMVC是一个基于java的实现了MVC设计模式的请求驱动类型的轻量级web框架,通过把model,view,controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发. 二、springMVC主要组件 1.前端控制器(dispatcherservlet):接收请…

【深度学习】复习温故而知新1

数据集ref&#xff1a;https://raw.githubusercontent.com/justinge/pic-go-for-xbotgo/master/Income1.csv X torch.from_numpy(data.Education.values.reshape(-1,1).astype(np.float32)) Y torch.from_numpy(data.Income.values.reshape(-1,1).astype(np.float32))y_pred…

当标签中出现输入了字母或者数字直接在一行上,没有换行的 情况时怎么办

当标签块中输入的是包含字母或者数字的时候&#xff0c;他不会换行&#xff0c;在一行上显示滚动条的形式&#xff0c;而我们想让他走正常文档流&#xff0c;该换行的时候换行 想要的如下效果 给相应的元素块添加该代码即可 word-break: break-all; .card-content { …

Dubbo与Spring Cloud等微服务框架的深度比较及选型指南

在当今的微服务架构领域&#xff0c;Dubbo与Spring Cloud作为两大主流框架&#xff0c;各自拥有独特的设计理念与技术优势&#xff0c;广泛应用于不同规模和类型的项目中。本文将从多个维度深入比较Dubbo、Spring Cloud以及其他代表性微服务框架&#xff08;如gRPC、Istio&…

酷开科技大屏营销,多元需求唤醒“客厅经济”

随着科技的发展和消费者习惯的变化&#xff0c;OTT大屏营销正逐渐成为客厅经济的新风向。OTT不仅改变了人们获取信息和娱乐的方式&#xff0c;也为品牌营销提供了新的机遇和挑战&#xff0c;OTT大屏营销已经成为客厅经济的重要组成部分。酷开科技通过其自主研发的智能电视操作系…

搜维尔科技:第九届元宇宙数字人设计大赛入围作品名单

随着第九届元宇宙数字人设计大赛渐近尾声&#xff0c;各院校提交的数字人作品已陆续完成评分统计汇总工作&#xff01;现将入围名单公布&#xff0c;请入围团队尽可能到场参加大赛颁奖典礼&#xff0c;具体获奖名次将在颁奖典礼中现场公布&#xff01; 颁奖典礼时间、地点&…

Codeforces Round 946 (Div. 3) C D

比赛链接&#xff1a;Dashboard - Codeforces Round 946 (Div. 3) - Codeforces 写在前面:比赛时C题卡了挺久&#xff0c;还没做出来&#xff08;qwq&#xff09;&#xff0c;D题也只是草草看了几眼&#xff0c;看榜单D题过的人数大于C题&#xff0c;写不出C题导致没心思看D题了…

不小心关闭了Linux的终端窗口怎么恢复文件?

当你在用vim编写程序的时候&#xff0c;没有保存你正在编写的程序&#xff0c;不小心关闭了窗口&#xff0c;而当你重新进入这个.c文件的时候&#xff0c;发现变成了只读文件&#xff1f;而且没有刚刚写的程序了&#xff1f;那刚刚写的程序是不是白写了&#xff1f; 不要慌&am…

一文了解 - GPS/DR组合定位技术

GPS Global Position System 全球定位系统这个大家都很熟悉&#xff0c; 不做太多介绍。 DR Dead Reckoning 车辆推算定位法&#xff0c; 一种常用的辅助的车辆定位技术。 DR系统的优点&#xff1a; 不需要发射和接收信号&#xff1b; 不受电磁波干扰。 DR系统的缺点&#x…

项目管理-质量管理

目录 一、质量管理概述 1.1 GB/T16260.1-2006 定义 1.2 GB/T19000-ISO 9000(2000)系列标准定义 二、软件质量模型 2.1 软件全生命周期质量模型 2.1.1 内部和外部质量的质量模型 2.1.2 使用质量的质量模型 2.1.3 McCall 质量模型 2.1.4 质量特性度量 2.1.5 相关概念 三…

【全开源】多功能投票小程序(ThinkPHP+FastAdmin+Uniapp)

打造高效、便捷的投票体验 一、引言 在数字化快速发展的今天&#xff0c;投票作为一种常见的决策方式&#xff0c;其便捷性和效率性显得尤为重要。为了满足不同场景下的投票需求&#xff0c;我们推出了这款多功能投票小程序系统源码。该系统源码设计灵活、功能丰富&#xff0…

spark实战:实现分区内求最大值,分区间求和以及获取日志文件固定日期的请求路径

spark实战&#xff1a;实现分区内求最大值&#xff0c;分区间求和以及获取日志文件固定日期的请求路径 Apache Spark是一个广泛使用的开源大数据处理框架&#xff0c;以其快速、易用和灵活的特点而受到开发者的青睐。在本文中&#xff0c;我们将通过两个具体的编程任务来展示S…

罗德里格斯公式(旋转矩阵)推导

文章目录 1. 推导2. 性质3. 参考 1. 推导 r r r为旋转轴&#xff0c; θ \theta θ为旋转角度。 先将旋转轴单位化 u r ∣ ∣ r ∣ ∣ u\frac{r}{||r||} u∣∣r∣∣r​ 旋转可以被分为垂直和旋转两个方向&#xff0c; 我们求沿轴方向的分量其实就是在求 p p p向量在 u u u方…