Qt之QtConcurrent无需使用低级线程原语编写多线程

news2024/9/23 3:29:53

几个要点:


通过QtConcurrent::run()返回的QFuture不支持取消、暂停,返回的QFuture只能用于查询函数的运行/完成状态和返回值。

请注意:该函数可能不会立即运行; 函数只有在线程可用时才会运行。

导入模块
在 C++ API changes 有关于 Qt Concurrent 的更改说明
Qt Concurrent has been moved from Qt Core to its own module
大致意思就是,Qt Concurrent已经从 QtCore 中移除并成为了一个独立的模块。
所以在使用的时候需要在工程文件中导入模块,如下
QT += concurrent

​​​​​​​

Qt之QtConcurrent_不会编程的-程序猿的博客-CSDN博客_qtconcurrent

示例1:将普通函数运行在两个不同的线程中

改文章中的示例文件在QT5.15的例子:

#include <QString>
#include <QDebug>
#include <QThread>
#include <QApplication>

//#include "qtconcurrentrun.h"
#include <QtConcurrent/QtConcurrent>

QString func1()
{
    qDebug()<<"我是func1函数";
    qDebug() << "from" << QThread::currentThread();
}

QString func2(QString name)
{
    qDebug()<<"我是func2函数";
    qDebug() << name << "from" << QThread::currentThread();
}
int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    QFuture<QString> fut1 = QtConcurrent::run(func1);// 1.用QFuture获取该函数的运行结果
    QFuture<QString> fut2 = QtConcurrent::run(func2, QString("Thread 1"));//2.参数2:向func函数传递的参数
    QString result1 = fut1.result();
    QString result2 = fut2.result();
    qDebug() <<"waitForFinished before";
    qDebug() <<"result1:" << result1;
    qDebug() <<"result2:" << result2;
    fut1.waitForFinished();
    fut2.waitForFinished();
        qDebug() <<" after waitForFinished";
    qDebug() <<"result1:" << result1;
    qDebug() <<"result2:" << result2;
}

pro文件需要添加一句:

QT += widgets

执行结果如下:

 由于两个函数非void函数,但是返回QString在各个方法里面并未出现所以会出现崩溃。

调试情况下会出现错误Segmentation fault:

将代码修正为:

#include <QString>
#include <QDebug>
#include <QThread>
#include <QApplication>

//#include "qtconcurrentrun.h"
#include <QtConcurrent/QtConcurrent>

QString func1()
{
    qDebug()<<"我是func1函数";
    qDebug() << "from" << QThread::currentThread();
    return "func1";
}

QString func2(QString name)
{
    qDebug()<<"我是func2函数";
    qDebug() << name << "from" << QThread::currentThread();
    return "func2";
}
int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    QFuture<QString> fut1 = QtConcurrent::run(func1);// 1.用QFuture获取该函数的运行结果
    QFuture<QString> fut2 = QtConcurrent::run(func2, QString("Thread 1"));//2.参数2:向func函数传递的参数
    QString result1 = fut1.result();
    QString result2 = fut2.result();
    qDebug() <<"waitForFinished before";
    qDebug() <<"result1:" << result1;
    qDebug() <<"result2:" << result2;
    fut1.waitForFinished();
    fut2.waitForFinished();
    qDebug() <<" after waitForFinished";
    qDebug() <<"result1:" << result1;
    qDebug() <<"result2:" << result2;
}

 则输出结果为:

 不在出现crashed

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

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

相关文章

Linux常用命令——rename命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) rename 用字符串替换的方式批量改变文件名 补充说明 rename命令用字符串替换的方式批量改变文件名。 语法 rename(参数)参数 原字符串&#xff1a;将文件名需要替换的字符串&#xff1b; 目标字符串&#x…

GuLi商城-人人开源搭建前端项目

人人开源&#xff1a; 下载到本地并解压&#xff1a; VsCode打开解压好的项目&#xff1a; MAC安装Nodejs&#xff0c;略 参考&#xff1a;MAC(m1)-安装Nodejs_ZHOU_VIP的博客-CSDN博客 MAC打开终端&#xff1a; npm install类似maven下载所有的组件 报错&#xff1a; 解…

Vue基础10之插件、scoped与lang的样式

Vue基础10插件scoped与lang样式scopedlang样式安装lessless样式的使用总结插件 plugins.js: export default {install(Vue){console.log("Vue:",Vue)//全局过滤器Vue.filter(mySlice,function (value){return value.slice(0,5)})//定义全局指令Vue.directive(fbind,…

【数据结构】8.6 基数排序

文章目录基数排序定义基数排序算法基数排序算法分析基数排序定义 前述的各类排序方法都是建立在关键字啊比较的基础上&#xff0c;而分配类排序不需要比较关键字的大小&#xff0c;它是根据关键字中各位的值&#xff0c;通过对待排序记录进行若干趟分配与收集来实现排序的&…

微信小程序 Springboot卫生应急培训报名系统java

本文以微信开发者、Springboot框架、java为开发技术&#xff0c;实现了一个卫生应急培训小程序。卫生应急培训小程序的主要使用者分为管理员服务端和用户客户端&#xff0c;其中管理员服务端权限&#xff1a;首页、个人中心、用户管理、通知公告管理、在线学习管理、培训管理、…

中国电子学会2021年09月份青少年软件编程Python等级考试试卷一级真题(含答案)

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;一级&#xff09; 分数&#xff1a;100.00 题数&#xff1a;37 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1. 取整除的运算符是&#xff1f;&#x…

每天一道大厂SQL题【Day02】

每天一道大厂SQL题【Day02】 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&#xff0c;以每日1题…

nuxt.js项目搭建

nuxt[文档数据] https://www.xuanmo.xin/details/3240 nuxt文档:https://zhuanlan.zhihu.com/p/76703748 nuxt文档:https://www.cnblogs.com/chanwahfung/p/12899714.html axios:https://axios.nuxtjs.org/ 参考:https://www.w3cschool.cn/nuxtjs/nuxtjs-b4kl36fw.html 案例实现…

编程的GCRoot应该怎么去找?

本文导读 本文通过抛出一个编程的上帝视角问题&#xff0c;我们了解什么是编程的上帝视角&#xff0c;编程如何学习以及编程的root是什么&#xff0c;找到root之后&#xff0c;我们有如何利用上帝视角去解决编程中的推理。 一、编程的上帝视角 上帝视角乃是叙述视角中&#…

23.网络编程(一)

目录 一.网络编程 1.1 什么是网络编程 1.2 网络通信基本模式 1.3 网络通信三要素 1.4 IP地址 1.4.1 什么是IP地址 1.4.2 IP的常见分类 1.4.3 IP地址基本寻路 1.4.4 IP地址形式 1.4.5 IP常用命令&#xff08;在命令提示符窗口中使用&#xff09; 1.4.6 特殊IP地址 1…

Docker安装Postgresql

测试环境&#xff1a;Centos7.x docker1.13.1 postgres12本文使用的是在镜像仓库直接pull的方式&#xff0c;非Dockfile的方式。Postgresql的Dockerfile参考&#xff1a;https://github.com/docker-library/postgres/blob/master/12/alpine/Dockerfile常用命令docker命令大全…

MySQL的卸载

步骤1&#xff1a;停止MySQL服务 在卸载之前&#xff0c;先停止MySQL8.0的服务。右击“此电脑“&#xff0c;选择”管理“&#xff0c;可以在“服务”列表找到“MySQL8.0”的服务&#xff0c;如果现在“正在运行”状态&#xff0c;可以右键单击服务&#xff0c;选择“停止”选…

java基础巩固-宇宙第一AiYWM:为了维持生计,大数据之Kafka【Kafka的概念、单机及集群部署】~整起

Rust一、Kafka基本概念1.Kafka是什么&#xff1f;Kafka与Flume&#xff1f;2.Kafka的整体架构&#xff1a;3.kafka的生产者与消费者&#xff1a;4.kafka的Topic与日志、分区【分区可以提高咱们kafka的写入能力和存储能力】5.kafka的顺序写入&#xff1a;6.kafka的零拷贝技术7.k…

MQ 队列消息

消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成,通过提供消息传递和消息排队模型,它可以在分布式环境下拓展进程间的通信,对于消息中间件,常见的角色大致也就有Producer(生产者).Consumer(消费者) MQ 消息中间件 消息队列 …

【数据结构基础】树 - 基础和Overview

知识体系结构树树是一种数据结构&#xff0c;它是n(n>0)个节点的有限集。n0时称为空树。n>0时&#xff0c;有限集的元素构成一个具有层次感的数据结构。区别于线性表一对一的元素关系&#xff0c;树中的节点是一对多的关系。树具有以下特点:n>0时&#xff0c;根节点是…

Linux嵌入式开发——文件权限

文章目录Linux嵌入式开发——文件权限文件权限文件权限管理修改文件权限修改文件所属用户拥有者拥有者组Linux嵌入式开发——文件权限 文件权限 文件权限是指不同的用户或用户组对某个文件拥有的权限&#xff0c;文件的权限分为三种&#xff0c;并且可以使用二进制表示文件权…

kerberos环境下parcel方式部署flink1.15.3 基于CDH6.3.2 Flink on Yarn

1.1 Flink on Yarn的优势相对于 Standalone 模式&#xff0c;在Yarn 模式下有以下几点好处&#xff1a;1.资源按需使用&#xff0c;提高集群的资源利用率&#xff1b;2.任务有优先级&#xff0c;根据优先级运行作业&#xff1b;3.基于 Yarn 调度系统&#xff0c;能够自动化地处…

通信原理笔记—模拟信号的数字编码

目录 低通与带通信号的抽样定理&#xff1a; 模拟信号数字编码的基本概念&#xff1a; 模拟信号的抽样&#xff1a; 低通信号的理想抽样&#xff1a; 低通采样定理&#xff1a; 采样方式&#xff1a; 冲激采样示例&#xff1a; 低通信号的自然抽样&#xff1a; 带通抽样…

正版授权|Charles 4 网络封包分析调试工具软件

Charles 4 是一款 HTTP 代理 /HTTP 监视器/反向代理&#xff0c;使开发人员能够查看其机器和 Internet 之间的所有 HTTP 和 SSL / HTTPS流量。这包括请求、响应和 HTTP 标头&#xff08;包含 Cookie 和缓存信息&#xff09;。 授权分类&#xff1a;单许可证 站点许…

Python程序设计-第2章Python程序语句

第2章Python程序语句一.预习笔记 1.1 if语句 if 条件 : 执行语句 注意&#xff1a;条件后面要有 : 号&#xff0c;其次条件不需要括号包裹&#xff0c;然后执行语句需要有缩进 1.2 if else语句 if 条件 : 执行语句1 else : 执行语句2 注意&#xff1a;条件成立执行语…