Qt中使用线程之QConcurrent

QConcurrent可以实现并发,好处是我们可以不用单独写一个类了,直接在类里面定义任务函数,然后使用QtConcurrent::run在单独的线程里执行一个任务

1、定义一个任务函数

2、定义1个QFutureWatcher的对象,使用QFutureWatcher来监测任务函数的返回值,其模板参数是任务函数返回值的类型

3、绑定QFutureWatcher的finished信号,通过其result()来获取任务函数运行结束后的返回值;因为任务函数运行结束时QFutureWatcher会发出finished信号

4、调用QtConcurrent::run开启1个单独的线程执行任务函数;该方法返回值为QFuture,其模板参数是任务函数返回值的类型

5、将run()方法的返回值QFuture设置给QFutureWatcher的对象,以便QFutureWatcher的对象能得到任务函数的返回值

举例:

点击开始任务按钮,开启子线程执行任务函数

在任务函数中对num自增,然后发信号给ui线程

ui线程收到信号,更新ui

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QtConcurrent>
#include<QPushButton>
#include<QFuture>
#include<QApplication>
#include<QFutureWatcher>
#include<QLabel>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr): QWidget(parent){resize(500,500);QPushButton* btn=new QPushButton("开启任务",this);btn->setGeometry(10,10,100,50);QPushButton* btn2=new QPushButton("停止任务",this);btn2->setGeometry(120,10,100,50);connect(btn2,&QPushButton::clicked,this,[=](){stop=true;});QLabel* lbl=new QLabel(this);lbl->setGeometry(10,70,400,100);QFont font;font.setBold(true);font.setPixelSize(15);lbl->setFont(font);//子线程发出信号,让主线程ui自己来更新connect(this,&Widget::labelInfo,this,[=](QString info){lbl->setText("num的值:"+info);});qDebug()<<"UI所在线程的id:"<<QThread::currentThreadId();connect(btn,&QPushButton::clicked,this,[=](){//槽函数中耗时操作//不用单独创建1个类了//1、使用QFutureWatcher来监测任务函数的返回值,其模板参数是任务函数返回值的类型QFutureWatcher<int>* future_watcher=new QFutureWatcher<int>;//2、绑定QFutureWatcher的finished信号,通过其result()来获取任务函数运行结束后的返回值//任务函数运行结束时QFutureWatcher会发出finished信号connect(future_watcher,&QFutureWatcher<int>::finished,future_watcher,[=](){qDebug()<<"返回值是:"<<future_watcher->result();future_watcher->deleteLater();});//3、调用QtConcurrent::run开启1个单独的线程执行任务函数;返回值为QFuture,其模板参数是任务函数返回值的类型QFuture<int> future= QtConcurrent::run(&Widget::timeTask,this);//4、将future设置给future_watcher,以便future_watcher能得到任务函数的返回值future_watcher->setFuture(future);});}~Widget()=default;protected:void closeEvent(QCloseEvent* ev) override{stop=true;}//定义任务函数int timeTask(){qDebug()<<"任务函数所在线程的id:"<<QThread::currentThreadId();int index=0;while(!stop){//向ui线程发出信号,更新label显示的值emit labelInfo(QString::number(index++));QThread::msleep(1000);}return 0;}
signals://自定义1个信号,利用这个信号的参数来更新label显示的值void labelInfo(QString info);private://任务函数停止标志bool stop=false;
};
#endif // WIDGET_H

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

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

相关文章

用Python将Office文档(Word、Excel、PowerPoint)批量转换为PDF

在处理不同格式的Office文档&#xff08;如Word、Excel和PowerPoint&#xff09;时&#xff0c;将其转换为PDF格式是常见的需求。这种转换不仅确保了文件在不同设备和操作系统间的一致性显示&#xff0c;而且有助于保护原始内容不被轻易修改&#xff0c;非常适合于正式报告、提…

Redisson(三)应用场景及demo

一、基本的存储与查询 分布式环境下&#xff0c;为了方便多个进程之间的数据共享&#xff0c;可以使用RedissonClient的分布式集合类型&#xff0c;如List、Set、SortedSet等。 1、demo <parent><groupId>org.springframework.boot</groupId><artifact…

【主机漏洞扫描常见修复方案】:Tomcat安全(机房对外Web服务扫描)

文章目录 引言I SSL/TLS Not ImplementedTomcat 服务器 SSL 证书安装部署(JKS 格式)Tomcat 服务器 SSL 证书安装部署(PFX 格式)HTTP 自动跳转 HTTPS 的安全配置(可选)修复SSL证书版本低II 主机漏洞扫描常见修复方案Apache JServ protocol serviceSlow HTTP DEnial of Ser…

多楼层智能穿梭:转运机器人助力制造业转型升级

针对当前喷砂产品人工转运存在的劳动强度大、效率低、安全隐患多等问题&#xff0c;本方案提出设计一套高效、安全、多楼层自动转运系统&#xff0c;采用潜伏式转运机器人结合电梯与升降平台技术&#xff0c;实现平面类、立柱类及小工件类喷砂产品的自动化、智能化转运。 项目需…

Docker 与 Yocto

Yocto项目为什么需要Docker Yocto 项目并不直接依赖 Docker&#xff0c;但在某些情况下使用 Docker 可以为 Yocto 项目提供以下具体且实际的好处&#xff1a; 1. 环境一致性&#xff1a; Yocto 构建需要一个稳定且一致的开发环境。不同的 Linux 发行版可能会有不同的库版本、…

深入探索电能消耗数据:基于机器学习的分析与洞察

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Java | Leetcode Java题解之第504题七进制数

题目&#xff1a; 题解&#xff1a; class Solution {public String convertToBase7(int num) {if (num 0) {return "0";}boolean negative num < 0;num Math.abs(num);StringBuffer digits new StringBuffer();while (num > 0) {digits.append(num % 7);…

【数据结构】包装类简单认识泛型-Java

包装类 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java给每个基本类型都给了一个包装类型 基本数据类型和对应的包装类 基本数据类型包装类ByteByteshortShortint Integer longLongfloatFloatdoubleDoublec…

wordcloud 字体报错

wordcloud 字体报错 词云库报错&#xff1a;Only supported for TrueType fonts字体文件问题pillow版本的问题wordcloud版本问题&#xff08;我的最终解决方案&#xff09; 词云库报错&#xff1a;Only supported for TrueType fonts 字体文件问题 解决方法 写绝对路径 &…

【故障解决】麒麟系统2403用户帮助手册点击无反应的解决方法

往期好文&#xff1a;【系统配置】命令行修改统信UOS的grub启动延时 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于如何解决麒麟系统2403版本中用户帮助手册点击无反应问题的文章。很多使用麒麟系统的小伙伴可能遇到过点击“用户帮助手册”后没有任何响应的情况…

【Linux学习】(3)Linux的基本指令操作

前言 配置Xshell登录远程服务器Linux的基本指令——man、cp、mv、alias&which、cat&more&less、head&tail、date、cal、find、grep、zip&tar、bc、unameLinux常用热键 一、配置Xshell登录远程服务器 以前我们登录使用指令&#xff1a; ssh 用户名你的公网…

gorm.io/sharding改造:赋能单表,灵活支持多分表策略(下)

背景 分表组件改造的背景&#xff0c;我在这篇文章《gorm.io/sharding改造&#xff1a;赋能单表&#xff0c;灵活支持多分表策略&#xff08;上&#xff09;》中已经做了详细的介绍——这个组件不支持单表多个分表策略&#xff0c;为了突破这个限制做的改造。 在上一篇文章中&…

机器学习基础:算法如何让 AI 自我学习

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 AI工具集1&#xff1a;大厂AI工具【共23款…

vue3+vue-baidu-map-3x 实现地图定位

文档地址&#xff1a;一个是2一个是3 https://dafrok.github.io/vue-baidu-map/#/zh/index vue-baidu-map-3x 1.首先要到百度地图开放平台上建一个账号&#xff0c;如果有百度账号可以直接登录百度地图-百万开发者首选的地图服务商,提供专属的行业解决方案 2.点击控制台&am…

ThreadLocal内存泄漏面试题

一、ThreadLocal内部结构 首先更好的说明ThreadLocal内存泄露的场景&#xff0c;以及具体的原因&#xff0c;先来了解下ThreadLocal的内部结构&#xff0c;如图1所示。 可以看到&#xff0c;ThreadLocal对象是存储在每个Thread线程内部的ThreadLocalMap中的&#xff0c;并且在…

行列式-常山赵子龙

终于知道这类题怎么写了 两个条件都要用到 要计算&#xff0c;减少直觉

【加密系统】华企盾DSC服务台提示:请升级服务器,否则可能导致客户端退回到旧服务器的版本

华企盾DSC服务台提示&#xff1a;请升级服务器&#xff0c;否则可能导致客户端退回到旧服务器的版本 产生的原因&#xff1a;控制台版本比服务器高导致控制台出现报错 解决方案 方法&#xff1a;将控制台回退到原来的使用版本&#xff0c;在控制台负载均衡查看连接该服务器各个…

图像分割-DeepLab

DeepLabV3源码链接&#xff1a;https://github.com/bubbliiiing/deeplabv3-plus-pytorch&#xff08;打不开私信我获取&#xff09; 一、简介 一般的模型如Unet一般用于医学领域&#xff0c;小目标&#xff0c;如细胞分割。 为了增大感受野&#xff08;从而更好的获得全局特征…

LeetCode 18.四数之和

LeetCode 18.四数之和 C 思路&#x1f9d0;&#xff1a; 由题意得&#xff0c;四个数组里面的整数相加需要得到target这个目标值&#xff0c;且结果不能重复&#xff0c;那么我们可以用排序双指针的方式进行解答&#xff0c;将该数组变为升序数组&#xff0c;然后固定左边两个数…

建站工具Halo

建站工具Halo 项目及文档快速体验启动成功 类似wordpress的建站工具&#xff0c;使用java技术栈Springboot开发&#xff0c;对java开发者友好。 项目及文档 https://github.com/halo-dev/halo 快速体验 为了快速体验&#xff0c;直接使用docker compose部署。也可在源码基础…