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;
}

打印如下:
[图片]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux基础命令(测试相关)

软件测试相关linux基础命令笔记 操作系统 常见Linux&#xff1a; Redhat系列&#xff1a;RHSL、Centos、FedoraDebian系列&#xff1a;Debian、Ubuntu以上操作系统都是在原生Linux系统上&#xff0c;增加了一些软件或功能。linux的文件及路径特点 Linux没有盘符的概念&#xf…

11.12每日一题(根式差型求极限:有理化、拉格朗日中值定理)

解决同一极限在两点函数值差时&#xff0c;拉格朗日中值定理常用&#xff0c;也非常有效&#xff01;

如何做好仓库管理工作?好的仓库管理的流程是什么?

本文将为大家讲解&#xff1a;如何做好仓库管理工作&#xff1f;好的仓库管理的流程是什么&#xff1f; ——“怎么样才能做好仓库管理工作&#xff1f;” ——“建议软硬兼施&#xff01;” “软”即仓库管理系统&#xff0c;“硬”即仓库管理制度。系统和制度不是孤立存在…

京东数据分析:2023年10月京东打印机行业品牌销售排行榜

鲸参谋监测的京东平台10月份打印机市场销售数据已出炉&#xff01; 10月份&#xff0c;打印机市场整体销售下滑。鲸参谋数据显示&#xff0c;今年10月份&#xff0c;京东平台打印机的销量将近60万&#xff0c;环比降低约2%&#xff0c;同比降低约5%&#xff1b;销售额为4.4亿&a…

mapbox实现框选要素

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

C/S医学检验LIS信息管理系统源码 检验科LIS系统源码

LIS系统又称实验室信息管理系统是专门为医院检验科而设计的一套实验室信息管理系统。 LIS通过将所有仪器自身提供的端口与科室LIS系统中的工作站点连接&#xff0c;通过LIS实现与医院HIS系统的联网。是一套符合医院检验科实际需要的管理系统&#xff0c;实现检验业务全流程的计…

全国停车位收费标准接口API

1) 请求地址 接口地址https://psbg.jparking.cn/cw-gateway/cwzg/v1/near_park 2) 调用方式&#xff1a;HTTP post 3) 接口描述&#xff1a; 数据来源捷停车 不可用于商用 概不负责 4) 请求参数: {"latitude": "29.563009", //坐标"longitude&quo…

Linux 进程优先级

什么是进程的优先级 优先级&#xff1a;对资源的访问顺序&#xff01;注意优先级与权限的区别&#xff0c;优先级决定的是访问资源的顺序&#xff0c;这意味着无论是谁都可以访问到资源&#xff1b;但是如果你没有权限&#xff0c;你是不能访问资源的&#xff01; 这个应该比较…

网络运维与网络安全 学习笔记2023.12.5

网络运维与网络安全 学习笔记 第三十五天 今日目标 su用户切换、sudo命令提权、部署动态Web应用 数据库安全加固、Web安全加固 网络监控基础、配置zabbix主控机、配置zabbix被控机 管理监控项、监控结果分析 su用户切换 su机制介绍及用法 Linux安全基线 指的是使Linux各项…

哈希表【1】

文章目录 &#x1f914;0.哈希表&#x1f33c;1. 两数之和&#x1f33b;1. 题目&#x1f337;2. 算法原理&#x1f33a;3. 代码实现 &#x1f348;面试题 01.02. 判定是否互为字符重排&#x1f34c;1. 题目&#x1f34f;2. 算法原理&#x1f353;3. 代码实现 &#x1f914;0.哈…

2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-C卷

2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-C卷 2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-C卷A模块基础设施设置/安全加固&#xff08;200分&#xff09;A 模块基础设施设置/安全加固&#xff08;200 分&am…

一个跨平台、跨空间支持多用户的远程云备份系统

多可云备份系统用于将一台服务器上的数据&#xff0c;高速备份到另一台或多台服务器上。无论这些服务器都在同一个局域网内&#xff0c;还是都在云服务器上&#xff0c;或者是分别在局域网内和云服务器上&#xff0c;使用多可云备份系统&#xff0c;都能够高速、高效、精确地完…

AntV和AntD之间的区别与联系

前言&#xff1a;最近在调研前端的一些框架&#xff0c;技术栈主要是用react&#xff0c;所以找到了2个十分相似解决方案&#xff0c;拿来对比一下&#xff08;antd和antv都是基于react&#xff09; antd对比antv antd antv 解决方案企业级 UI 设计语言数据可视化解决方案提供…

每日一练 | 华为认证真题练习Day142

1、路由器的主要功能&#xff0c;以下说法错误的是&#xff1f;&#xff08;多选&#xff09; A. 通过多种协议建立路由表 B. 根据路由表指导数据转发 C. 根据收到数据包的源IP地址进行转发 D. 实现相同网段设备之间相互通信 2、管理员发现无法通过TFTP传输文件到华为AR200…

【设计模式】策略模式设计-电影票打折功能

任务二&#xff1a;使用策略模式设计电影票打折功能 某电影院售标系统为不同类型的用户提供了不同的打折方式&#xff08;Discount&#xff09;&#xff0c;学生凭学生证可享受8折优惠**&#xff08;StudentDiscount&#xff09;&#xff0c;儿童可享受减免10元的优惠&#xf…

使用gunicorn部署django项目时,发现静态文件加载失败问题

本文主要介绍如何配置Niginx加载Django的静态资源文件&#xff0c;也就是Static 1、首先需要将Django项目中的Settings.py 文件中的两个参数做以下设置&#xff1a; STATIC_URL /static/ STATIC_ROOT os.path.join(BASE_DIR, static) 2、将 STATICFILES_DIRS [ os.p…

开关电源有哪些EMI整改?|深圳比创达电子EMC

某控制产品在进行辐射发射测试时&#xff0c;发现测试结果超标&#xff0c;辐射发射测试结果如下图所示&#xff1a; 控制产品在去掉发射源之前&#xff0c;就在各外部端口采取了各种滤波措施&#xff0c;结果并无明显作用&#xff0c;即使把所有相关外部引线全部拿走(只剩下电…

js 防抖函数、节流函数

/** 节流函数 */ export function throttle(func, wait 100) {let isDoing falsereturn function (...rest) {if (isDoing) returnisDoing truesetTimeout(() > {func(...rest)isDoing false}, wait)} }/** 防抖函数 */ export function debounce(func, wait 100) {let…

微信小程序开发:地图路线规划全流程,超详细!!!(包括遇到的问题解决)

目录 效果展示 第一章 准备阶段 1.1 使用uniapp搭建微信小程序 1.2 条件1&#xff1a;appId&#xff08;微信小程序appId&#xff09; 1.3 条件2&#xff1a;key&#xff08;腾讯位置服务申请的key&#xff09; 1.4 条件3&#xff1a;插件appId&#xff08;微信小程序插件…

C语言每日一题(41)循环队列

力扣 622 循环队列 题目描述 设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前…