news 2026/9/29 8:26:10

Qt中线程的使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qt中线程的使用

Qt中线程的使用

在qt中线程的使用有两种方式,第一种就是创建一个类继承QObject类,之后使用moveToThread函数将线程添加到类中。另一种就是创建一个类继承QThread类,在类中实现run函数。

第一种方式:

1、首先创建一个自定义的类,继承QObject。

#ifndef THREAD001_H #define THREAD001_H #include <QObject> class MyThread : public QObject { Q_OBJECT public: explicit MyThread(QObject *parent = nullptr); void stop(); private: bool state = false; signals: public slots: void slotsFun(QString number); }; #endif // THREAD001_H
#include "mythread.h" #include <QDebug> #include <QThread> MyThread::MyThread(QObject *parent) : QObject(parent) { } void MyThread::stop() { state = false; qDebug()<<"Thread001::stop() 当前线程号:"<< QThread::currentThreadId(); } void MyThread::slotsFun(QString number) { qDebug()<<"父线程号:"<<number; qDebug()<<"当前线程号:"<< QThread::currentThreadId(); state = true; static int i = 0; while(state){ qDebug()<<"i的数值:"<<i <<" state = "<<state; i++; QThread::sleep(1); } }

以上代码就是创建的类,在上述的代码中,能看到在头文件中定义了一个slotsFun()槽函数、一个stop()公共函数和一个state私有的成员变量。

slotsFun()槽函数就是我们最终要执行的线程函数。

state私有的成员变量是为了设置线程函数的循环限制,当我们要停止线程退出的时候可以使用公共函数stop设置state为false,这样就退出了线程函数。

这里的stop函数不属于线程,而是属于主线程。

2、启动线程

当我们定义好了线程类之后,就可以在需要启动线程的地方启动线程了。

QThread* m_thread = nullptr;//这个是qt的线程类 MyThread* m_mythread = nullptr;//这个是我们自定义的线程类
void MainWindow::on_btn_create_clicked() { if(m_thread == nullptr){ m_thread = new QThread();//实例化线程对象 m_mythread = new MyThread();//实例化自定义的线程对象 m_mythread->moveToThread(m_thread);//线程绑定 //线程结束函数信号槽,用于当线程结束之后释放资源。 connect(m_thread,&QThread::finished,this,[=](){ qDebug()<<"m_thread001 线程执行结束"; m_thread->deleteLater(); //释放线程资源 m_thread = nullptr; m_mythread->deleteLater();//释放自定定义的线程类资源 m_mythread = nullptr; }); //启动线程之后,线程发出的信号 connect(m_thread,&QThread::started,this,[=](){ qDebug()<<"m_thread001 线程执行启动"; }); //调用线程函数,线程启动之后,还需要调用一下自定义线程类中槽函数 connect(this,&MainWindow::startThreadFun,m_mythread,&MyThread::slotsFun); } }
void MainWindow::on_btn_start_clicked() { //启动线程 m_thread->start(); qDebug()<<"主线程id:"<<QThread::currentThreadId(); //发送信号调用槽函数 emit startThreadFun("看上面的主线程id"); }

3、关闭线程

关闭线程小编使用了很多方式,都没有达到理想的状态,首先是使用QThread中的**terminate**()函数,此函数关闭之后线程中的资源很难释放。因为他是强制的,线程函数无论执行到哪里了都会强制退出线程。

后面就换了中方式,先使用自定义线程类函数退出线程函数,之后再关闭线程类,这样就能很好的释放线程资源了。

void MainWindow::on_btn_stop_clicked() { m_mythread->stop(); m_thread->quit(); m_thread->wait(); }

这里有个小知识点,就是假如我们在自定义的类中定义了俩个槽函数,并且都是在线程启动之后发出信号,那么这两槽函数都是此线程的线程函数,只不过是按发送信号的顺序执行的。

第二种方式

1、创建线程类继承QThread类

#ifndef MYTHREAD2_H #define MYTHREAD2_H #include <QThread> #include <QDebug> class MyThread2 : public QThread { public: MyThread2(); void stop(); void run() override; private: bool state = false; }; #endif // MYTHREAD2_H
#include "mythread2.h" MyThread2::MyThread2() { } void MyThread2::stop() { state = false; qDebug()<<"Thread001::stop() 当前线程号:"<< QThread::currentThreadId(); } void MyThread2::run() { qDebug()<<"当前线程号:"<< QThread::currentThreadId(); state = true; static int i = 0; while(state){ qDebug()<<"slotsFuni的数值:"<<i <<" state = "<<state; i++; QThread::sleep(1); } }

以上代码中run就是继承QThread中的虚函数run。使用这中方式启动线程直接调用start函数即可。

2、启动

void MainWindow::on_btn_start_clicked() { if(m_mythread2 == nullptr){ m_mythread2 = new MyThread2(); connect(m_mythread2,&QThread::finished,this,[=](){ qDebug()<<"m_mythread2 线程执行结束"; m_mythread2->deleteLater(); m_mythread2 = nullptr; }); } m_mythread2->start();//启动线程 }

3、当run函数退出的是后线程就自动结束了。这里和第一种方式不太一样,第一种方式需要使用Qthread中的quit和wait函数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 8:24:41

Android逆向实战:用Frida+Frida-dexdump一键脱壳APK(附完整命令清单)

Android逆向实战&#xff1a;Frida与frida-dexdump高效脱壳技术解析 在移动安全研究领域&#xff0c;APK加固技术日益复杂&#xff0c;传统静态分析方法往往难以获取完整代码逻辑。Frida动态插桩框架配合frida-dexdump工具链&#xff0c;已成为逆向工程师突破加固防线的利器。本…

作者头像 李华
网站建设 2026/8/23 9:45:14

AI专著写作新趋势!工具大集合,让学术专著创作不再繁琐

对于学术研究者来说&#xff0c;撰写一本学术专著并不是一次灵光乍现的成就&#xff0c;而是一场漫长的“持久战”。从一开始的选题想法&#xff0c;到逐步搭建出严谨的章节结构&#xff0c;再到字斟句酌地填充内容、核查文献引用&#xff0c;这每一步都充满了困难。研究者们不…

作者头像 李华
网站建设 2026/9/29 8:25:47

免费开源IT资产管理系统:Snipe-IT让企业资产管理变简单

免费开源IT资产管理系统&#xff1a;Snipe-IT让企业资产管理变简单 【免费下载链接】snipe-it A free open source IT asset/license management system 项目地址: https://gitcode.com/GitHub_Trending/sn/snipe-it 还在为混乱的IT资产而头疼吗&#xff1f;想象一下&am…

作者头像 李华