Qt多线程之继承QObject(moveToThread方式)

article/2025/10/6 21:23:04

Qt多线程有两两种方式,第一种继承QThread,复写run()函数,但是run()和main()类似,run()函数才是子线程的入口函数,所以在设计到类的操作时,必须把对象或者指针放在run函数里面,否则就不在一个线程里面了,会出现错误。

第二种方式,继承QObject,通过moveToThread()将自定义的线程添加到子线程QThread里,然后信号槽的方式实现,shix实现主线程和子线程的交互。

本文只为给自己学习QT多线程做个笔记。本文使用第二种方式,Qt官方主推的方式。

注意:

继承QObject,调用moveToThread方法用的时候要强调的几个重点:
自定义的MyThread线程类的对象在创建时不能指定父对象!
启动子线程后,并没有启动子线程处理函数;
启动子线程处理函数必须用signal-slot方式!!!
在线程处理函数内部,绝对不允许操作ui图形界面(比如跳个弹窗等等),线程内部通常是纯数据处理!

 

 

线程退出:

线程在使用时,需要判断线程的状态。isRunning()。

thread->quit();//退出线程,会等待线程执行完毕。

thread->wait();//回收资源

子线程是while(1)一般使用设置标志位来实现线程的退出。

myThread->setFlag(true);

 

 

代码如下:

1.pro文件

#-------------------------------------------------
#
# Project created by QtCreator 2019-10-29T14:52:07
#
#-------------------------------------------------QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = ThreadUI2
TEMPLATE = app# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0CONFIG += c++11SOURCES += \main.cpp \widget.cpp \mythread.cppHEADERS += \widget.h \mythread.hFORMS += \widget.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

2.mythread.h文件

#ifndef MYTHREAD_H
#define MYTHREAD_H#include <QObject>class MyThread : public QObject
{Q_OBJECT
public:explicit MyThread(QObject *parent = nullptr);~MyThread();//线程处理函数void MyTimeout();void setFlag(bool flag = true);signals:void mySignal();//定义一个信号,在该子线程中每秒发射一次该信号private:bool isStop;
public slots:
};#endif // MYTHREAD_H

3.mythread.h文件

#include "mythread.h"
#include<QThread>
#include<QtDebug>
MyThread::MyThread(QObject *parent) : QObject(parent)
{isStop=false;
}MyThread::~MyThread()
{}void MyThread::MyTimeout()
{while(isStop==false){QThread::sleep(1);emit mySignal();qDebug()<<"sub thread :"<<QThread::currentThread();if(true==isStop){break;}}
}void MyThread::setFlag(bool flag)
{isStop=flag;
}

4.widget.h文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include"mythread.h"
#include<QThread>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = nullptr);~Widget();signals:void startThread();//启动子线程的信号private slots:void on_pushButtonStart_clicked();void on_pushButtonStop_clicked();void dealSignal();void dealClose();private:Ui::Widget *ui;MyThread *myT;QThread *thread;
};#endif // WIDGET_H

5.widget.cpp文件

#include "widget.h"
#include "ui_widget.h"
#include<QtDebug>
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);myT=new MyThread;//不能指定父对象thread=new QThread(this);//创建子线程myT->moveToThread(thread);//把自定义的线程加入到子线程中connect(myT,&MyThread::mySignal,this,&Widget::dealSignal);qDebug()<<"main thread: "<<QThread::currentThread();connect(this,&Widget::startThread,myT,&MyThread::MyTimeout);connect(this,&Widget::destroyed,this,&Widget::dealClose);//右上角X 关了 窗口线程还在运行}Widget::~Widget()
{delete ui;
}void Widget::dealSignal()
{static int i=0;i++;ui->lcdNumber->display(i);
}void Widget::dealClose()
{on_pushButtonStop_clicked();//停止线程delete myT; //释放线程空间
}
//start按钮
void Widget::on_pushButtonStart_clicked()
{if(thread->isRunning()==true){return;}//启动线程 但是满意启动线程处理函数thread->start();myT->setFlag(false);//不能直接调用线程处理函数,直接调用导致线程处理函数和主线程在同一个线程// myT->myTimeout();///只能通过signal - slot方式emit startThread();}//stop按钮
void Widget::on_pushButtonStop_clicked()
{if(thread->isRunning()==false){return;}myT->setFlag(true);thread->quit();thread->wait();}

6.widget.ui文件

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>Widget</class><widget class="QWidget" name="Widget"><property name="geometry"><rect><x>0</x><y>0</y><width>418</width><height>276</height></rect></property><property name="windowTitle"><string>Widget</string></property><layout class="QVBoxLayout" name="verticalLayout" stretch="2,0"><item><widget class="QLCDNumber" name="lcdNumber"/></item><item><layout class="QHBoxLayout" name="horizontalLayout"><item><widget class="QPushButton" name="pushButtonStart"><property name="text"><string>Start</string></property></widget></item><item><widget class="QPushButton" name="pushButtonStop"><property name="text"><string>Stop</string></property></widget></item></layout></item></layout></widget><layoutdefault spacing="6" margin="11"/><resources/><connections/>
</ui>

7.UI界面


http://chatgpt.dhexx.cn/article/IsQpBYsn.shtml

相关文章

xshell官网最新 中文,xshell

Xshell 是国内比较流行的SSH管理软件&#xff0c;和其他的SSH客户端相比&#xff0c;Xshell更加注重用户体验的一些东西&#xff0c;比如其现代化的界面&#xff0c;多种语言包括简体中文支持&#xff0c;代码高亮等&#xff0c;对于新手非常友好。 Xshell中还提供了一些高级功…

Linux、Xshell

Linux基础命令 linux基础操作1. 创建目录2. 创建文件3. 删除4. 删除前询问5. 复制6. 修改文件名7. 移动文件8. 查看文件9. 查看五行10. 查看文件末尾11. 查看文件后五行12. 动态查看文件&#xff08;相当于日志&#xff09;13. 查看文件内容14. 查看输过的命令15. 清除页面16. …

Linux,Xshell

一.部署Linux环境 首先安装VMware和ISO镜像文件。 然后在windows会产生两个虚拟网卡&#xff1a;vmnet1&#xff0c; vmnet8。 登录VM密钥可以自己想办法的。 1.创建虚拟机&#xff0c;直接点击主页创建就OK。 2.选择自定义&#xff0c;点击下一步 3.兼容性选择默认即可点击…

xshell是什么软件

xshell是什么软件? Xshell 是一个强大的远程管理软件&#xff0c;它支持SSH&#xff0c;TELNET 协议。Xshell可以在Windows下访问远端服务器、路由器、网络机顶盒等&#xff0c;类似的常用软件还有putty&#xff0c;以及Windows下的Telnet。 下面简单介绍一下xshell软件。 X…

xshell工具

xshell工具 xshell 是一款非常好用的Linux客户端连接工具&#xff0c;但是是收费的&#xff0c;我们可以使用它的家庭和学校用户的免费许可证 。但是需要我们去官网注册。 https://www.netsarang.com/zh/xshell-download/ 获取到对应的安装软件直接安装即可 xshell的配置 安…

安卓一键清理内存_力推!一键深度清理手机内存垃圾,从此和卡顿告别

今天给大家推荐的这款软件是猎豹清理大师v7.2.9去广告高级版。 该软件可以说是比较专业的垃圾清理软件了&#xff0c;在Google Play已经被下载超过了10亿次。 软件体验 会员功能全部免费使用&#xff0c;这个是不需要进行付费的版本&#xff0c;会员拥有去广告、自动垃圾清理、…

win10深度清理c盘垃圾的方法【系统天地】

C盘作为win10系统安装盘&#xff0c;使用一段时间后会产生大量的垃圾文件&#xff0c;不仅占用内存还会影响电脑运行速度。很多新手不知道c盘哪里文件是可以删除的。带着win10如何深度清理c盘的问题&#xff0c;我们往下看看爱纯净的方法。 win10纯净版深度清理c盘垃圾的方法…

苹果手机如何深度清理_苹果手机还可以这样清理垃圾,怪不得用这么久还流畅如丝...

苹果手机凭借着它优异的功能受到大家的喜欢&#xff0c;独特的IOS系统让它用多久都会觉得非常的流畅&#xff0c;虽然说苹果手机的功能很受大家的青睐&#xff0c;但是苹果手机有一个缺陷&#xff0c;那就是内存不怎么够用&#xff0c;今天教大家如何去清理苹果手机的内存给手机…

微信内测新功能(深度清理),瞬间释放几个G内存!

点击上方关注 “终端研发部” 设为“星标”&#xff0c;和你一起掌握更多数据库知识 微信是国人日常生活离不开的软件&#xff0c;而微信堪称吃存储的大户。我们几乎每天都在使用微信&#xff0c;使用的时间越长&#xff0c;信息积累的也越多。 聊天记录和朋友圈中的图片、视频…

App Cleaner Uninstaller for Mac v8.1.2 应用深度清理卸载工具 兼容 M1

App Cleaner & Uninstaller Pro 是一款mac应用清理、mac应用卸载工具&#xff0c;它可以帮你深度清理应用残留&#xff0c;完全卸载mac应用程序。 应用介绍 App Cleaner & Uninstaller Pro 是一款mac应用清理、mac应用卸载工具&#xff0c;它可以帮你深度清理应用残留…

苹果手机如何深度清理_安卓手机必备清理软件APP,完全免费超级深度清理

大家好欢迎观看软件兔 大家都知道安卓手机本身的一些小问题&#xff0c;手机在运行的过程中会产生很多垃圾文件&#xff0c;图片、视频、音频还有广告图片&#xff0c;你手机用个一年就非常卡了&#xff0c;那是因为你手机里面的垃圾越来越多了&#xff0c;垃圾多了你手机就越来…

苹果手机如何深度清理_手机应用 | 推荐5款深度清理手机内存的软件

点击上方蓝色字 关注我吧 ✎ 前言 手机内存越来越大,软件也越来越多,随之而来的影响就是手机里面的文件垃圾越来越多,短期里也许不会产生什么影响,但是长期下来手机就会变的卡顿,所以这次就来推荐5款安卓手机内存清理的手机软件。我会从颜值、实用性两个方面进行打分分析,…

cleanmymac是怎么进行Mac的深度清理的

2019独角兽企业重金招聘Python工程师标准>>> mac电脑深度清理软件中说得上好的当属mac清理系统垃圾cleanmymac了&#xff0c;可以清理垃圾、清理插件、释放内存等等&#xff0c;真正做到电脑深度清理。 免费下载地址&#xff1a;http://wm.makeding.com/iclk/?zone…

计算机命令清除所有,电脑深度清理命令设置方法

今天windows7之家小编要为网友们带来大福利&#xff0c;教大家电脑深度清理命令设置方法&#xff0c;帮助网友们快速有效的清理垃圾。相信网友们都迫不及待的想要学习电脑深度清理命令设置方法了吧。那就不要犹豫&#xff0c;一起跟着小编往下看电脑深度清理命令设置方法吧。 新…

深度清理电脑垃圾软件 如何深度清理电脑垃圾

怎么样清理电脑室每个使用者都应该知道的&#xff0c;包括mac用户&#xff0c;因为在使用过程中&#xff0c;会产生大量的缓存文件、系统日志、索引文件等&#xff0c;如果我们不定时清理就会堆积在那里。为了使电脑更加干净&#xff0c;非常好的方法就是使用电脑深度清理软件。…

深度清理mac磁盘空间的方法,方方面面都清理干净

对于Mac用户&#xff0c;特别是买了丐版的用户来说&#xff0c;清理磁盘往往是一件比较头疼的事情。因为随着Mac上安装越来越多的应用程序&#xff0c;它们肯定会占用你磁盘中的大量空间。而且这些应用程序还会生成缓存、系统日志文件、更新文件等&#xff0c;Mac会因此开始运行…

Windows 10怎样不利用第三方付费软件实现对C盘的深度清理

时间来到了公元2022年&#xff0c;现在以前很多免费的软件都要成为会员才能使用很多功能了。 比如我现在想对我的C盘进行一个深度清理&#xff0c;试了两款软件&#xff0c;分别是驱动精灵和Wise Care&#xff0c;都需要付费成为会员才能解锁相关功能&#xff0c;截图如下。 …

win10系统的深度清理方法

随着时间的推移,每个Windows安装都会产生占用空间和浪费资源的垃圾。我们很容易忽视常规维护,因此问题往往来自旧文件和程序。 如果您不清理计算机,不久您就会遇到磁盘空间不足的警告,并注意到它变慢了。让我们来看看如何在不同的情况下使用各种工具来清理Windows 10。   …

android空间深度清理,安卓手机垃圾深度清理技巧

原标题&#xff1a;安卓手机垃圾深度清理技巧 手机清理应该养成习惯&#xff0c;有些安卓手机内建一键加速功能&#xff0c;但有些没有&#xff0c;这时就要安装一套多功能的清垃圾加速软件&#xff0c;帮助手机获得更快速度。Space Cleaner(内存清理)是一款旨在让用户手机保持…

不等式约束的序列二次规划(SQP)

讲完等式约束的SQP&#xff0c;接下来就是不等式约束的SQP,其实两者的算法是完全没有区别的&#xff0c;唯一的就是因为引入了不等式约束&#xff0c;再推导上面就会去考虑近似KKT条件&#xff0c;从这个角度进行思考。解当前的问题就是解这个问题的对偶问题&#xff0c;两者在…