Qt的多线程类

主要介绍一些Qt的多线程类

QThread

QThread 是 Qt 提供的基本的多线程类,它允许创建自定义的线程。可以继承 QThread 类,并重写其 run() 方法,在 run() 方法中编写线程要执行的代码。以下是一个简单的示例:

#include <QThread>
#include <QDebug>class MyThread : public QThread {
public:void run() override {qDebug() << "MyThread is running";// 执行线程任务}
};int main() {MyThread thread;thread.start(); // 启动线程thread.wait(); // 等待线程执行完毕return 0;
}

在这个示例中,我们创建了一个名为 MyThread 的自定义线程类,重写了 run() 方法,在其中编写线程要执行的任务。
然后在 main() 函数中创建了一个 MyThread 对象,并通过调用 start() 方法启动线程。

QtConcurrent

QtConcurrent 是 Qt 提供的高级并行编程框架,它简化了多线程编程,并提供了一组并行算法和容器。使用 QtConcurrent,可以很容易地并行执行任务,无需手动管理线程。以下是一个简单的示例:

#include <QtConcurrent/QtConcurrent>void myFunction() {// 执行任务
}int main() {// 并行执行任务QtConcurrent::run(myFunction);return 0;
}

在这个示例中,我们使用 QtConcurrent::run() 函数并行执行了一个函数 myFunction()

QFuture

QFutureQFutureWatcher 是 Qt 中用于处理异步操作的两个关键类,它们通常一起使用来实现异步编程模型。

  1. QFuture

    • QFuture 类似于 C++ 标准库中的 std::future,用于表示异步操作的结果。
    • 可以通过 QtConcurrent::run() 或者其他方式创建一个返回 QFuture 对象的异步操作,然后在需要的时候等待该操作完成并获取结果。
    • QFuture 提供了方法如 waitForFinished()result() 来等待异步操作完成和获取操作的结果。
  2. QFutureWatcher

    • QFutureWatcher 用于监视 QFuture 的状态变化,并在异步操作完成时发出信号。
    • 可以将 QFutureWatcher 与一个或多个 QFuture 关联,然后通过连接信号(如 finished() 信号)来处理异步操作的完成事件。
    • 这样,可以在异步操作完成后执行特定的逻辑,而不必主动轮询 QFuture 的状态。

示例代码如下:

#include <QCoreApplication>
#include <QtConcurrent>
#include <QFutureWatcher>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 创建一个异步操作,返回 QFuture 对象QFuture<int> future = QtConcurrent::run([]() {qDebug() << "Async task is running in thread:" << QThread::currentThread();return 42;});// 创建一个 QFutureWatcher,并与 QFuture 关联QFutureWatcher<int> watcher;watcher.setFuture(future);// 连接信号,异步操作完成时执行特定逻辑QObject::connect(&watcher, &QFutureWatcher<int>::finished, [&]() {qDebug() << "Async task is finished, result:" << watcher.result();a.quit();});return a.exec();
}

在这个例子中,通过 QtConcurrent::run() 创建了一个异步操作并返回一个 QFuture 对象,然后创建了一个 QFutureWatcher 对象,并将其与 QFuture 关联。通过连接 finished() 信号,可以在异步操作完成时执行特定的逻辑。

QThreadPool

  1. QThreadPool
    QThreadPool 是 Qt 提供的线程池类,用于管理线程的执行。它可以在应用程序中创建一组线程,并在这些线程中执行任务。通过使用线程池,可以避免反复创建和销毁线程的开销,提高线程利用率和应用程序的性能。

  2. QRunnable
    QRunnable 是一个接口类,用于表示可以在线程池中执行的任务。它包含一个纯虚函数 run(),需要子类实现具体的任务逻辑。通过将任务实现为 QRunnable 的子类,可以方便地将任务提交到线程池中执行。

使用 QThreadPoolQRunnable 可以实现高效的并发编程,以下是简单的示例代码:

#include <QtConcurrent>
#include <QDebug>class MyTask : public QRunnable {
public:void run() override {// 执行具体的任务逻辑qDebug() << "Task is running in thread:" << QThread::currentThread();}
};int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 创建线程池QThreadPool pool;// 创建任务对象MyTask task;// 将任务提交到线程池中执行pool.start(&task);return a.exec();
}

以上代码中,创建了一个线程池 pool,并创建了一个任务对象 task,然后通过 pool.start() 将任务提交到线程池中执行。在任务中实现的逻辑会在线程池中的某个线程中执行。

使用 QThreadPoolQRunnable 可以方便地实现多线程编程,执行异步任务,提高应用程序的响应性和性能。

适用场景

  1. QThread:适合创建自定义线程。
  2. QtConcurrent:适合简单的并行和异步操作,能够快速地实现多线程编程。
  3. QFuture:适合需要对异步操作进行精细控制或者自定义状态传递的场景。
  4. QThreadPool:适合管理和执行任务,并提供了线程池的功能。

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

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

相关文章

03、判断和循环

三、判断与循环 文章目录 三、判断与循环顺序结构分支结构If语句在程序中就是用来判断的switch 循环结构forwhiledo while 顺序结构 顺序结构是Java程序默认的执行流程&#xff0c;按照代码的先后顺序&#xff0c;从上到下依次执行。 分支结构 If语句在程序中就是用来判断的 …

C语言 实用调试技巧

我们的博客已经更新到了数据结构&#xff0c;但是当我在深耕数据结构时我发现我在C语言是遗漏了一个重要的东西&#xff0c;那就是C语言的使用调试技巧。这篇博客对数据结构非常重要&#xff0c;请大家耐心观看。 1. 什么是bug&#xff1f; 第一次被发现的导致计算机错误的飞蛾…

抖音小店怎么高效的对接达人?分享四年老运营的经验,可记笔记!

大家好&#xff0c;我是电商糖果 抖音现在最火的卖货方式&#xff0c;依旧是达人带货&#xff0c;也就是商家和达人合作模式。 有很多刚开店的朋友找达人合作总是失败&#xff0c;不知道什么原因。 其实找达人合作是需要技巧的&#xff0c;糖果做抖音小店已经四年了&#xf…

Vue2 基础三组件化开发

代码下载 组件 (Component) 是 Vue.js 最强大的功能之一&#xff0c;组件可以扩展 HTML 元素&#xff0c;封装可重用的代码。 组件注册 全局注册&#xff1a; Vue.component(组件名称, {data: 组件数据,template: 组件模板内容});// 全局组件Vue.component(button-counter, …

在AI创业热潮下,如何抓住AI赚钱机会,实现人生逆袭

随着人工智能技术的迅猛发展,AI创业热潮正席卷全球。这不仅为科技领域的专业人士提供了无限的商机,也为普通人开辟了全新的赚钱途径。本文将为您揭示在AI创业热潮下,普通人如何抓住AI赚钱机会,实现人生逆袭,同时探讨哪些行业适合应用AI技术。 一、普通人如何抓住AI赚钱机…

前端基础篇-快速了解 Vue 前端框架(Vue 指令)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Vue 概述 2.0 Vue 指令 2.1 指令 - v-bind 2.2 指令 - v-model 2.3 指令 - v-on 2.4 指令 - v-if、v-else-if、v-else 2.5 指令 - v-show 2.6 指令 - v-for 3.0 生…

实现C++自定义的String类

一、简介 采用了COW写时复制的方式实现&#xff0c;即在每个String类数据域之前用了4个字节的空间进行引用计数。通过拷贝构造函数或者赋值运算符函数进行赋值时不会重新开辟空间&#xff0c;只会对引用计数加一&#xff0c;当有修改操作时&#xff0c;才会重新开辟新的空间&a…

es文档操作命令

文档操作 documents 创建数据&#xff08;put&#xff09; 向 user 索引下创建3条数据 PUT /user/_doc/1 {"name":"zhangsan","age":18,"sex":"男","info":"一顿操作猛如虎&#xff0c;一看工资2500"…

码云简化版使用教程

码云简化版使用教程 ①创建本地项目 ②在本地项目根目录下创建git相关目录及文件 ③在码云上创建新的仓库 ④在本地项目中配置仓库地址&#xff0c;提交项目内容 下面直接从第二步开始讲解 在本地项目根目录下创建git相关目录及文件 1、打开项目根目录&#xff0c;进入cmd界…

Linux应用 线程同步之互斥锁

1、概念 1.1 定义 互斥锁&#xff08;Mutex&#xff09;&#xff0c;又称互斥型信号量&#xff0c;是一种特殊的二值性信号量&#xff0c;主要用于实现对共享资源的独占式处理。任意时刻&#xff0c;互斥锁的状态只有两种&#xff1a;开锁或闭锁。当有任务持有时&#xff0c;…

旧衣服回收小程序开发,“互联网+”模式下巨大收益

近年来&#xff0c;在人们生活水平的提高下&#xff0c;旧衣物随之增加&#xff0c;如何处理旧衣服成为了当下大众所困扰的问题。 当下&#xff0c;旧衣回收行业已经成为了一个新的热门行业&#xff0c;我国人口众多&#xff0c;旧衣物的市场规模也在不断扩大&#xff0c;市场…

【QT入门】qmake和cmake的简单区别

声明&#xff1a;该专栏为本人学习Qt知识点时候的笔记汇总&#xff0c;希望能给初学的朋友们一点帮助(加油&#xff01;) 往期回顾&#xff1a; 【QT入门】Windows平台下 QT的编译过程-CSDN博客 【QT入门】VS2019QT的开发环境配置-CSDN博客 【QT入门】VS2019和QT Creator如何添…

基于springboot+vue的房屋交易平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

代码随想录算法训练营Day48 | LeetCode121. 买卖股票的最佳时机、LeetCode122.买卖股票的最佳时机II

LeetCode121. 买卖股票的最佳时机 动规五部曲&#xff1a; 1、dp[i][0]:在第i天持有股票的最大收入&#xff1b;dp[i][1]:在第i天不持有股票的最大收入。 2、递推公式&#xff1a;第i天持有股票&#xff0c;有两种情况&#xff1a;前一天已经持有&#xff0c;当天刚买入&#…

Greetings

Problem - 1915F - Codeforces 题意 给一些(l,r)找到所有能够包含(l,r)的数目 引入 也就是找逆序对个数 要用到归并排序中的思想&#xff1a; //https://www.luogu.com.cn/problem/P1216 #include<iostream> #include<cstdio> #include<stack> #include…

用python如何实现智能合约?如何使用remix编写solidity智能合约并部署上链

目录 用python如何实现智能合约? 直接展示下成功界面 下面分步骤说: remix代码 python链接remix代码

将查询出来数据中相对应的字段根据枚举类更改为其中文内容

&#x1f413;1.通过mapper.xml文件中的内容使用casewhen进行更换字段内容 SELECT case user_type when 101000 then 李明 when 101001 then 王丽 when 101002 then 王小黑 when 101003 then 王大黑 when 101004 then 超级大王 when 101005 then 小董 else end as 别称 from…

python面向对像之第二次笔记

python面向对像 一、面向对象的三大特性面向对象包含3大主要特性&#xff1a;封装私有成员继承复写 pass关键字多态 总结 一、面向对象的三大特性 面向对象包含3大主要特性&#xff1a; 封装 封装是面向对象编程中的一个重要概念&#xff0c;它指的是将数据&#xff08;属性&a…

STM32信息安全 1.2 课程架构介绍:芯片生命周期管理与安全调试

STM32信息安全 1.2 课程架构介绍&#xff1a;STM32H5 芯片生命周期管理与安全调试 下面开始学习课程的第二节&#xff0c;简单介绍下STM32H5芯片的生命周期和安全调试&#xff0c;具体课程大家可以观看STM32官方录制的课程&#xff0c;链接&#xff1a;1.2. 课程架构介绍&…

记一些有关Element Plus的样式修改

先记一个放着&#xff0c;后续慢慢补充。。。 一个 Vue 3 UI 框架 | Element Plus Radio 单选框 1、去除radio的圆圈 .box-radio {/deep/ .el-radio__input {display: none;} }