QThread之moveToThread用法

简介

使用moveToThread函数的流程如下:
1、创建一个类继承自QObject类或其子类,并在其中定义所要执行的多个任务,执行多个任务就要定义相应的信号。
2、任务通过moveToThread指定所要执行的线程。
3、线程通过start启动
4、通过信号与槽机制触发线程的执行

为什么要用

适用场景:

  • 适合单次任务执行,即有点像懒人,触发一下,干一次活
  • 适合干完活,需要主动推送一个通知
  • 适合用于简化多线程中,对数据安全的保护

它不适用的场景:

  • 不适用高频率任务,即跑完一个任务,可能没有时间休息,持续跑
  • 执行高频率任务,还是需要使用重写QThread::run()的方式,来实现

示例一个循环读取进度条的模型
在这里插入图片描述

1.首先定义我们的worker
头文件

//
// Created by zhe.xiao on 2023/12/05.
//#pragma once#include "std_include.h"
#include <QObject>class OperationWorker : public QObject
{
Q_OBJECT
public:explicit OperationWorker(QObject* parent = nullptr);~OperationWorker();signals:void SendRecordImportProgress(QString ecgPath);public slots:void ProcessRecordImportProgress(QString ecgPath);
};

cpp文件

//
// Created by zhe.xiao on 2023/12/05.
//#include "operation_worker.h"
#include <QThread>OperationWorker::OperationWorker(QObject* parent) : QObject(parent)
{}OperationWorker::~OperationWorker()
{}void OperationWorker::ProcessRecordImportProgress(QString ecgPath)
{qDebug("===OperationWorker ProcessRecordImportProgress, ecgPath=%s", ecgPath.toStdString().c_str());int i = 0;while (i <= 100){std::string percent = std::to_string(i) + "%";emit SendRecordImportProgress(QString(percent.c_str()));i += 15;}
}

2.定义一个控制器,专门来控制worker

头文件
//
// Created by zhe.xiao on 2023/12/05.
//#pragma once#include "std_include.h"
#include "operation_worker.h"
#include <QObject>
#include <QThread>class OperationController : public QObject
{
Q_OBJECT
public:explicit OperationController(QObject* parent = nullptr);~OperationController() override;//触发读取记录仪进度条void StartRecordImportProgress();signals:void TriggerRecordImportProgress(QString ecgPath);public slots:void ReceiveRecordImportProgress(QString percent);private:QThread m_workThread;
};

cpp文件

//
// Created by zhe.xiao on 2023/12/05.
//#include "operation_controller.h"OperationController::OperationController(QObject* parent) : QObject(parent)
{auto operationWorker = new OperationWorker();operationWorker->moveToThread(&m_workThread);//绑定事件connect(&m_workThread, &QThread::finished, operationWorker, &QObject::deleteLater);connect(this, &OperationController::TriggerRecordImportProgress, operationWorker, &OperationWorker::ProcessRecordImportProgress);connect(operationWorker, &OperationWorker::SendRecordImportProgress, this, &OperationController::ReceiveRecordImportProgress);//线程启动m_workThread.start();
}OperationController::~OperationController()
{m_workThread.quit();m_workThread.wait();
}void OperationController::StartRecordImportProgress()
{emit TriggerRecordImportProgress("xiaozhe");
}void OperationController::ReceiveRecordImportProgress(QString percent)
{qDebug("===OperationController ReceiveRecordImportProgress, percent=%s", percent.toStdString().c_str());
}

注:由于Worker是QObject对象,同时通过connect(&thread, &QThread::finished, operationWorker, &QObject::deleteLater)建立信号槽;当线程释放时,会自动删除Worker对象,并不会内存泄漏。

3.外部函数触发执行

int OperationRecorderImport::Test()
{auto operationController = new OperationController();;operationController->StartRecordImportProgress();return OPERATION_SUCCESS;
}

打印如下:
[图片]

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

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

相关文章

【AI绘画】万字长文——(超详细)ControlNet的详细介绍使用Stable Diffusion的艺术二维码完全生成攻略

目录 前言一、名词解释1-1、Stable Diffusion介绍1-2、ControlNet介绍1-2-1、ControlNet介绍&工作原理1-2-2、ControlNet控制方法介绍 1-3、案例分析1-3-1、室内装修设计1-3-2、品牌创意海报 1-4、stable-diffusion-webui 的参数解释 二、生成方法2-1、图像到图像2-1-1、二…

Python使用netmiko配置华为交换机

一、netmiko介绍 1.更适合网络设备的自动化运维模块。 二、场景 1、批量查询 2、批量配置变更、备份 三、项目地址 GitHub - ktbyers/netmiko: Multi-vendor library to simplify Paramiko SSH connections to network devices 三、使用步骤 1.安装netmiko pip install ne…

D6208单片双向马达驱动电路国产芯片,工作电源电压范围宽(4.5V~15.0V),内设保护二极管采用SOP8封装

D6208 是一块单片双向马达驱动电路&#xff0c;它使用TTL电平的逻辑信号就能控制卡式录音机和其它电子设备中的双向马达。该电路由一个逻辑部分和一个功率输出部分组成。逻辑部分控制马达正、反转向及制动&#xff0c;功率输出部分根据逻辑控制能提供100mA&#xff08;典型值&a…

腾讯地图系列(二):微信小程序添加插件(三种方法)以及插件AppId获取

目录 第一章 前言 第二章 添加插件 2.1 微信小程序添加插件方法一&#xff08;微信公众平台添加插件&#xff09; 2.2 微信小程序添加插件方法二&#xff08;通过项目配置添加插件&#xff09; 2.3 微信小程序添加插件方法三&#xff08;微信公众平台服务市场添加插件&…

spring mvc理解

spring mvc M&#xff1a;model 模型 V&#xff1a;view 视图 C&#xff1a;controller 控制器 S: service 服务处理 D: Dao 数据持久化 视图 我理解就是web页面&#xff0c;帮助用户调用后端接口。 前后端分离之后&#xff0c;view似乎就和后端没什么关系了。 模型 格式…

zabbix6.4监控交换机发现ICMP报错Ping item must have target or host interface specified

报错信息&#xff1a; 查看监控项&#xff1a; 修改键值&#xff1a; 保存再次检查&#xff0c;发现又报错/usr/sbin/fping: [2] No such file or directory 原因是&#xff0c;zabbix-server上没有安装fping工具 解决方法&#xff1a;yum install fping -y 之后数据采集正常…

中建信息携手麒麟软件共建生态 助推华南区数字经济建设

这里写自定义目录标题 日前&#xff0c;中建信息携手麒麟软件在广州共同举办了“2023年麒麟软件华南渠道大会”&#xff0c;与来自广东、广西、海南各地市近300位渠道合作伙伴代表共聚一堂&#xff0c;于交流探讨中凝心聚力&#xff0c;亦探新机、启新程、谋新篇。 共聚大会&am…

【unity3D】Transform组件(如何访问和获取Transform组件)

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的Transform组件 Transform组件 基础知识介绍三个成员变量常用属性扩展 Transform的相关查找方法静态方法 基础知识 介绍 在Unit…

Java 如何正确比较两个浮点数

看下面这段代码&#xff0c;将 d1 和 d2 两个浮点数进行比较&#xff0c;输出的结果会是什么&#xff1f; double d1 .1 * 3; double d2 .3; System.out.println(d1 d2);按照正常逻辑来看&#xff0c;d1 经过计算之后的结果应该是 0.3&#xff0c;最后打印的结果应该是 tru…

mapbox实现框选要素

成果图 参考博客 https://blog.csdn.net/ScapeD/article/details/89158755 原理与源码 利用mapbox的queryRenderedFeatures方法可以获取范围内的要素&#xff0c;但是这个只能是点和矩形和范围内的全屏要素&#xff0c;并不支持多边形&#xff0c;所以实现这个的思路就是画完框…

【JavaEE进阶】 Spring核⼼与设计思想

文章目录 &#x1f332;Spring 是什么&#xff1f;&#x1f384;什么是IoC呢&#xff1f;&#x1f388;传统程序开发&#x1f388;传统程序开发的缺陷&#x1f388;如何解决传统程序的缺陷&#xff1f;&#x1f388;控制反转式程序开发&#x1f388;对⽐总结规律 &#x1f340;…

适用于 Windows 的最佳(免费/付费)数据恢复软件

借助最佳数据恢复工具从 Windows PC 恢复丢失和删除的数据 您是否正在寻找一种巧妙的方法来从计算机中取消删除或恢复已删除的文件&#xff1f;如果是&#xff0c;那么这篇文章就是为您准备的&#xff01;在本教程中&#xff0c;我们整理了一份全面的数据恢复软件列表&#xf…

Android 第三十九章 RatingBar

一、属性 android:isIndicator“false” 此评级栏是否为指示器&#xff08;用户不可更改&#xff09;。 默认false 可更改&#xff0c;true 不可更改android:numStars“6” 设置星星数量android:rating“1” 设置默认评级android:stepSize“2” 设置步长 二、示例 class Mai…

机器人学习目标

学习目标&#xff1a; 若干年后&#xff0c;我们都将化为尘土&#xff0c;无人铭记我们的存在。那么&#xff0c;何不趁现在&#xff0c;尽己所能&#xff0c;在这个世界上留下一些痕迹&#xff0c;让未来的时光里&#xff0c;仍有人能感知到我们的存在。 机器人协会每届每个阶…

在 Vue 3 项目中实现图片的在线预览(百度搜索暂未验证)

当使用 Vue 3 TypeScript Vite 完成图片在线预览时&#xff0c;你可以使用第三方库 vue-image-lightbox 来实现。以下是如何在 Vue 3 TypeScript Vite 项目中完成这个任务的示例&#xff1a; 首先&#xff0c;安装 vue-image-lightbox 库&#xff1a; npm install vue-ima…

外包干了4年,技术退步明显...

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

Pip命令:Python包管理的利器

Pip是Python的一个强大的包管理工具&#xff0c;它可以帮助我们轻松地安装、升级和管理Python包。在这篇文章中&#xff0c;我将介绍Pip命令的基本用法和一些高级技巧。 安装Pip 在大多数Python发行版中&#xff0c;Pip都是默认安装的。如果你的系统中还没有安装Pip&#xff0c…

postgres pg_dump: fe_sendauth: no password supplied问题处理

postgres pg_dump: fe_sendauth: no password supplied问题处理 1、pg_dump: fe_sendauth: no password supplied问题处理&#xff08;root 用户&#xff09;2、解决方法2.1、创建 .pgpass文件2.2、chmod 600 ~/.pgpass 3、额外情况 1、pg_dump: fe_sendauth: no password supp…

codeforces每日两道思维题(第 二 天)

2 C. Challenging Cliffs 原题链接&#xff1a;Problem - 1537C - Codeforces rating : 1200 题目描述&#xff1a; 你是一名游戏设计师&#xff0c;想要创建一个障碍赛道。玩家将从左到右行走。你已经选择了 n 座山的高度&#xff0c;并希望安排它们&#xff0c;以便第一座…

SCAU:18037 20秒后的时间

18037 20秒后的时间 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC Description 编写程序&#xff0c;输入三个整数变量hour&#xff08;小时&#xff09;、minute&#xff08;分钟&#xff09;、second&#xff08;秒&#xff09;…