Qt 多线程之MoveToThread()

Qt多线程开发:重写run()与moveToThread()的深度对比与实践指南 在桌面应用开发中,多线程是解决界面卡顿、提升响应性的核心技术。其核心原理在于创建独立的执行流,让耗时操作在后台运行,从而避免阻塞主线程的事件循环。从技术价值看,良好的多线程设计能显著提升用户体验和程序性能。在Qt框架中,实现多线程主要有两种路径:一是通过继承QThread并重写run()方法,这是一种基于继承的传统方式;二是使用moveToThread()配合工作者对象,这是基于组合的现代方式。这两种方式在**线程亲和性**和**事件循环**处理上存在本质区别。前者将任务逻辑与线程生命周期强绑定,适合简单计 阅读详情

            本文粗略整理一下关于Qt 多线程中MoveToThread()的用法,以便回顾。    

  Qt中想实现多线程技术是很方便的,只需要子类化QThread且重新实现它的run()即可。可参阅《C++ GUI Qt4编程》第二版的第十四章。

   MoveToThread()也能用于实现多线程,见代码:

#include "DBMoveToThread.h"
#include <QThread>
DBMoveToThread::DBMoveToThread(QObject *parent) :
    QObject(parent)
{   
   DBThread *thread = new DBThread;
   this->moveToThread(thread);
   thread->start();
}

void DBMoveToThread::callWork()
{
    qDebug()<<"callWork  :  "<<QThread::currentThread();
}

void DBMoveToThread::slotWork1()
{
    qDebug()<<"slotWork1 : "<<QThread::currentThread();
}

void DBMoveToThread::slotWork2()
{
    qDebug()<<"slotWork2 : "<<QThread::currentThread();
}

void DBMoveToThread::slotWork3()
{
    qDebug()<<"slotWork3 : "<<QThread::currentThread();
}

定义了一个继承自QObject的类:DBMoveToThread,子类化QThread类,然后将DBMoveToThread对象(this)丢进thread中,thread->start();语句就是开启一个线程,相当于《C++ GUI Qt4编程》中说的run()函数。这样之后,DBMoveToThread对象中的槽函数就会在非GUI线程中运行。

此处生成了3个对象:

work(用于调用callwork()函数,预计在GUI线程中运行)

work12(调用槽函数:slotwork1(),slotwork2(),预计在同一个线程中运行)

work3(调用槽函数:slotwork3(),预计在另外一个线程中运行) 

调用slot函数的代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    work   = new DBMoveToThread;

    work12 = new DBMoveToThread;

    work3  = new DBMoveToThread;

    connect(ui->callButton,SIGNAL(clicked()),this,SLOT(maincall()));
    connect(ui->slot1Button,SIGNAL(clicked()),work12,SLOT(slotWork1()),Qt::QueuedConnection);
    connect(ui->slot2Button,SIGNAL(clicked()),work12,SLOT(slotWork2()),Qt::QueuedConnection);
    connect(ui->slot3Button,SIGNAL(clicked()),work3,SLOT(slotWork3()),Qt::QueuedConnection);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::maincall()
{
    work->callWork();
}


class DBThread是个空架子,主要是希望这个类能实现多线程:继承自QThread,.h代码如下:

#ifndef DBTHREAD_H
#define DBTHREAD_H

#include <QThread>

class DBThread : public QThread
{
    Q_OBJECT
public:
    explicit DBThread(QObject *parent = 0);

private:

signals:

public slots:

};

#endif // DBTHREAD_H

程序运行之后观察调试信息,和预计看相符否。
点击按钮 次序call---->slot_1---->slot_2---->slot_3

输出见附图(图上房了,在顶部):

callwork()   直接调用-----------处于GUI线程中

slotwork1,2()是调用的槽函数,对象是work12-------------新的线程中

slotwork3()是调用的槽函数,对象是work3-------------另外一个线程中

 

 



 

 

从QThread::run()到moveToThread:手把手教你选择Qt多线程的正确打开方式 本文深入探讨Qt多线程编程的两种核心方案:QThread子类化与moveToThread模式。通过对比分析线程亲和性、事件循环机制及资源管理策略,提供实时数据处理、线程安全实践等场景的代码示例,帮助开发者根据项目需求选择最优多线程实现方式,提升应用响应速度与稳定性。 阅读详情

相关推荐

一文搞定之Qt多线程(QThread、moveToThread)

总结在Qt中如何实现多线程编程。

树欲静静风不止止的博客 4万+

QT -- 多线程 —— moveToThread

要将对象移动到主线程,请使用QApplication::instance()来检索指向当前应用程序的指针,然后使用QApplication::thread()来检索应用程序所在的线程。1、创建一个类继承自QObject类或其子类,并在其中定义所要执行的多个任务,执行多个任务就要定义相应的信号。思考改进:使用定时器代替sleep,在定时器事件中执行任务函数。2、任务通过moveToThread指定所要执行的线程。运行效果如下,程序有问题,并非并发,有个线程会卡住。运行效果如下,点击按钮后,第一下会慢。

xuechanba的博客 1万+

12V INPUT电源电路设计中的关键保护机制解析【精简】

本文深入解析了12V INPUT电源电路设计中不可或缺的关键保护机制。针对常见的电源反接、过压及浪涌等风险,文章详细拆解了PMOS防反接、TVS过压钳位、OVP芯片关断以及快速断电电路等核心防护方案的设计原理、选型要点与实战优化技巧,旨在帮助工程师构建可靠、经济的电源前端防御体系。

weixin_29158047的博客 228

关于this->moveToThread(this)——QtWidgets

官方关于QThread的用法有两种:一是子类QThread,并重新实现run;二是使用QObject::MoveToThread,通过信号槽在不同的线程内通信。最近看到了一种写法,就是将两者融合就是子类QThread,然后this->moveToThread(this)。觉得很奇怪,但是也不能说有错,自己写demo测了一下,能用,就是需要注意的东西挺多。

xiaopei_yan的博客 1972

Python批量注册脚本开发详细

开发一个Python批量注册脚本需要考虑多个方面,包括目标网站的注册流程、验证码处理、请求发送、数据存储等。以下是一个详细的开发流程和代码示例,用于实现基本的批量注册功能。

nsp202505的博客 3343

西门子S7-200 SMART PLC控制伺服电机

以下是使用西门子S7-200 SMART PLC控制伺服电机的详细程序框架和配置说明,涵盖硬件接线、PLC配置和基本运动控制逻辑。具体实现需根据伺服电机型号(如松下、三菱、台达等)调整参数。通过以上步骤,可实现伺服电机的基础位置控制。实际应用需根据设备机械参数和伺服驱动器手册调整细节。建议在调试时逐步测试脉冲输出和方向信号是否正常。

CHUXUEZHE8210的博客 6422

QT 中的多线程之 moveToThread

​QThread 类提供了一个与平台无关的管理线程的方法。一个 QThread 对象管理一个线程。QThread 的执行从 run() 函数的执行开始,在 Qt 自带的 QThread 类中,run() 函数通过调用 exec() 函数来启动事件循环机制,并且在线程内部处理 Qt 的事件。在 Qt 中建立线程的主要目的就是为了用线程来处理那些耗时的后台操作,从而让主界面能及时响应用户的请求操作。继承 QThread 类下面通过具体的方法描述和例子来介绍第一种方法,第二种方法在下一篇文章中介绍。

火山上的企鹅 1万+

在windows10/11中使用ipatool提取苹果app安装包ipa文件

本文介绍了在Windows10/11系统中使用ipatool工具下载苹果App安装包(.ipa)的详细步骤。首先需准备Windows电脑、AppleID账号并下载ipatool工具;具体操作包括:登录AppleID、搜索应用、获取购买授权、查看历史版本及下载指定版本。关键步骤强调获取授权的重要性,并提供了常用命令速查表,帮助用户完成从登录到下载的全过程。该教程适用于需要获取旧版本App或进行应用测试的场景。

zhengshaolin128的博客 2568

QT中this->moveToThread(m_thread);是什么意思

"this->moveToThread(m_thread);" 意思是将当前对象(通过 "this" 指针指向)移动到名为 "m_thread" 的线程中。这意味着该对象的所有槽函数和信号将在 "m_thread" 线程中运行。 ...

weixin_35757191的博客 445

YOLO11改进-模块-引入多尺度差异融合模块MDFM

MDFM主要用于融合双时相图像特征并生成带有丰富上下文信息的差异特征,其过程包含以下步骤:1. 特征提取与差异特征生成首先从双时相图像中提取特征f1和f2,然后将f1和f2进行像素级别的相减,再对相减结果取绝对值,最后通过一个3x3的卷积操作得到Di。2. 多尺度特征融合(MSFF)接着利用多尺度特征学习机制来增强特征融合效果。该机制通过不同核大小的卷积构建多尺度融合过程,具体是通过一个名为 MSFF 单元来实现的。

qq_64693987的博客 4378

C#与大数据分析:如何通过上位机进行设备故障诊断与预测

设备故障诊断是通过对设备的运行状态数据进行分析,识别和确认故障的类型和位置。而设备故障预测则是通过对设备的历史数据和运行状态进行分析,预测设备何时可能出现故障,从而进行预防性维护。数据采集:通过各种传感器、PLC、嵌入式设备等采集设备运行数据,如温度、压力、振动、转速、功率等。数据预处理:对采集到的数据进行清洗、去噪、缺失值处理、标准化等操作,以确保数据质量。特征工程:从原始数据中提取出有助于故障诊断和预测的特征,例如统计特征、时域特征、频域特征等。数据分析与建模。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1060

QT多线程使用moveToThread

使用线程有两种方法: 一、平时我们使用线程的时候一般是继承QThread,实现它的run()函数,将需要在线程执行的代码放在run()里边运行。如果需要在线程 { while(bRun)//如果需要退出线程就将bRun设置为false. { qDebug()<<"run thread ID = "<<QThread::c...

Giles__的博客 1602

Mybatis面试题(基础篇)

(1)mybatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。(2)mybatis避免了几乎所有的JDBC代码(说明了mybatis底层用的就是JDBC,只不过是封装了)和手动设置参数以及获取结果集。(3)mybatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的pojo映射成数据库中的记录。

qq_38196449的博客 1686

QT多线程QThread::run()与QObject::moveToThread()标准用法

目录 1、使用QThread::run() 2、使用QObject::moveToThread 3、常见的错误编程方法 QT实现多线程有两种方法: 1、继承QThread类,并重写run()函数; 2、写一个对象worker,声明或new一个QThread变量thread,然后把这个对象移动到子线程中:worker.moveToThread(&thread);...

野生猿-群号1025127672 6055

052、联发科Imagiq HyperEngine架构适配:天玑9000/9200的ISP多核并行调度与Tuning Toolkit调优案例

摘要: 项目组在适配联发科天玑9200的Imagiq 890 ISP架构时,遇到多摄预览功耗过高、帧率不稳等问题。通过分析多核调度机制,调整辅核QoS通道、优化AI-ISP协同模式(采用FREERUN+运动补偿),并利用Tuning Toolkit的Pipeline Viewer动态分配负载,最终降低功耗30mA、提升画质。关键经验包括:避免多核带宽冲突、合理配置动态时钟策略,以及统一校准参数版本管理。天玑9000/9200的HyperEngine架构需优先理解多核协同逻辑,再针对性调优,否则易引发场景兼容

zzfmlxs的博客 33

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Qt笔记(10) qt多线程---moveToThread()方式

#ifndef MYTHREAD_H #define MYTHREAD_H #include <QThread> #include <QImage> class MyThread : public QThread { Q_OBJECT public: explicit MyThread(QObject *parent = nullptr); signals: void finishImage(const QImage image); public slo

qq_31759493的博客 631

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Qt实现多线程的两种方式:重写run()和moveToThread(),connect第五个参数说明

重写QThread的虚函数run() mythread.h #ifndef MYTHREAD_H #define MYTHREAD_H #include <QThread> //头文件和基类由QObject改成QThread class MyThread : public QThread { Q_OBJECT public: explicit MyThread(QObject *parent = nullptr); protected: //QThread的虚函数

weixin_40355471的博客 1674

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Qt多线程中的moveToThread()的简单用法

之前在项目中用到了Qt的多线程,因为以前用的一直是用一个类直接继承QThread,然后再重写run()方法。需要注意的是:QThread只有run函数是在新线程里的,其他所有函数都在QThread生成的线程里。后来查阅了一些资料才知道,Qt有两种多线程的方法,其中一种是继承QThread的run函数,另外一种是把一个继承于QObject的类用moveToThread函数转移到一个Thread里。...

古道云的博客 2万+

Qt多线程之moveToThread()函数

(之前对多线程的理解不够深入,有一些认识是错误的,最近重新写多线程程序,然后修改一下博客)在使用“继承QObject+QThread”实现多线程时,出现了一个BUG,最后发现是对moveToThread()函数理解不到位导致的。为了弄清楚这个问题最好将Demo代码拷贝,跟着跑一遍。

qq_40438388的博客 1887

qt-- Qt实现多线程的两种方式:重写run()和moveToThread()通过connect调用

moveToThread():定义一个线程类,继承于QObject,在主线程实例化一个该类的对象,并实例化一个QThread类的对象,前者moveToThread后者,通过信号槽的方式实现多线程,可以定义多个信号槽,槽函数都是在同一个子线程运行,可以通过connect第五个参数控制槽函数是否在子线程运行(多线程下默认是多线程,队列是多线程,直接是在主线程运行槽)。原文链接:https://blog.youkuaiyun.com/weixin_40355471/article/details/110393257。

code_snow的博客 389

【Qt】多线程QThread::run()与QObject::moveToThread()

官方链接。

目标:MVP 2451

Qt多线程编程避坑指南:QThread的moveToThread()实战详解

本文深入解析Qt多线程编程中moveToThread()的正确使用方法,通过实战案例展示如何避免常见陷阱,提升线程安全性和性能。文章详细介绍了线程亲和性、信号槽连接类型选择以及五大黄金法则,帮助开发者掌握QThread的高效应用。

weixin_30369041的博客 422

Qt多线程编程-moveToThread()方法

Qt多线程编程,moveToThread()方法

propor的专栏 673

QT 多线程中不同于新建继承QThread类的方式:moveToThread()

两篇博文可以看下: https://www.cnblogs.com/vegetable/p/6648609.html https://blog.youkuaiyun.com/wangjianbo09/article/details/83352930 Qt中线程的一种创建方式,就是使用QObject::moveToThread()函数。如下,直接上源代码,可以把费时的任务放到doWork()方法里进...

weixin_42208807的博客 502

QThread:moveToThread()实现多线程

Qt实现多线程 Qt实现多线程有两种方式: (1)继承QThread,重写run()方法 (2)使用moveToThread() 本文仅用第二种方法来实现多线程 创建步骤 1.新建thread项目 2.添加新类MyWork 右键项目->添加新文件->C++ Class ->输入类名MyWork,继承自QObject->确定。 我们所需要实现的功能(函数)都可以放到这个MyWork类 3.为MyWork添加槽函数 在mywork.h中声明两个槽函数 private slots:

无人之国 1132

Qt 多线程编程的 QThread 类 (详细)

本文结构如下: 概述 优雅的开始我们的多线程编程之旅 我们该把耗时代码放在哪里? 再谈 moveToThread() 启动线程前的准备工作 开多少个线程比较合适? 设置栈大小 启动线程/退出线程 启动线程 优雅的退出线程 操作运行中的线程 获取状态 运行状态 线程标识 更为精细的事件处理 操作线程 安全退出线程必备函数:wait() 线程间的礼让行为 线程的中断标志位 为每个线程提供独立数据 附:所有函数...

周杰伦 4507
上一篇: QT TcpSocket 传送结构体
下一篇: 将qint8类型的数组放进float类型的数组里面
QQ_278397935
博客等级 码龄18年 120粉丝 32原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值