> 文档中心 > QThread线程启动的两种方法(含源码+注释)

QThread线程启动的两种方法(含源码+注释)


一、多线程示例图

下图为多线程运行示例图,在输出界面回发现各个线程ID不相同,如次的话则线程创建运行成功,源码在本文第三节(源码含详细注释)。
在这里插入图片描述

二、启动QThread的两种方法

  1. 通过继承QThread类的自定义线程类实现多线程
  2. 通过moveToThread方法实现多线程

三、废话少说上源码

1.方法一(继承QThread实现):

CThread.h

#ifndef CTHREAD_H#define CTHREAD_H#include #include class CThread : public QThread{    Q_OBJECTpublic:    explicit CThread(QObject *parent = nullptr);    void run();//在该函数种写想要执行的代码,使用当前类指针调用start函数运行};#endif // CTHREAD_H

CThread.cpp

#include "CThread.h"#include CThread::CThread(QObject *parent)    : QThread(parent){}void CThread::run(){    while (true)    { //输出当前函数和当前线程ID qDebug() << QThread::currentThreadId() << "我是线程ID, 继承线程类方法实现的"; //设置线程睡眠一秒(单位为秒) QThread::sleep(1);    }}

2.方法二(通过moveToThread实现):

CMoveFuncClass.h

#ifndef CMOVEFUNCCLASS_H#define CMOVEFUNCCLASS_H#include class CMoveFuncClass : public QObject{    Q_OBJECTpublic:    explicit CMoveFuncClass(QObject *parent = nullptr);public slots:    void doSomething();//在该函数种写想要执行的代码,通过信号槽触发};#endif // CMOVEFUNCCLASS_H

CMoveFuncClass.cpp

#include "CMoveFuncClass.h"#include #include CMoveFuncClass::CMoveFuncClass(QObject *parent)    : QObject(parent){}void CMoveFuncClass::doSomething(){    while (true)    { //输出当前函数和当前线程ID qDebug() << QThread::currentThreadId() << "我是线程ID, moveToThread方法实现的"; //设置线程睡眠一秒(单位为秒) QThread::sleep(1);    }}

3.创建线程示例

CMainWindow.h

#ifndef CMAINWINDOW_H#define CMAINWINDOW_H#include #include "CThread.h"#include "CMoveFuncClass.h"namespace Ui {class CMainWindow;}class CMainWindow : public QMainWindow{    Q_OBJECTpublic:    explicit CMainWindow(QWidget *parent = 0);    ~CMainWindow();signals:    void startMoveThread();private slots:    void on_startBtn_clicked();//触发方法二函数的信号private:    Ui::CMainWindow *ui;    CThread  *m_cThread;//方法一指针    CMoveFuncClass  *m_moveFunc;//方法二指针    QThread  *m_thread;//方法二所移至的线程指针};#endif // CMAINWINDOW_H

CMainWindow.cpp

#include "CMainWindow.h"#include "ui_CMainWindow.h"#include CMainWindow::CMainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::CMainWindow){    ui->setupUi(this);    /方法一///    //new出CThread对象    m_cThread = new CThread; /方法二///    //new出CMoveFuncClass对象    m_moveFunc = new CMoveFuncClass;    //new一个moveToThread的接收线程并启动    m_thread = new QThread;    m_thread->start();  //一定记得启动,否则运行不了    //连接相应信号槽    connect(this, &CMainWindow::startMoveThread, m_moveFunc, &CMoveFuncClass::doSomething);    connect(m_thread, &QThread::finished, m_moveFunc, &QObject::deleteLater);    //将对象移至线程    m_moveFunc->moveToThread(m_thread);}CMainWindow::~CMainWindow(){delete m_cThread;delete m_moveFunc;delete m_thread;    delete ui;}void CMainWindow::on_startBtn_clicked(){    //通过start启动方法一线程    m_cThread->start();    //发送信号启动方法二线程    emit startMoveThread();    //创建一个标记函数,限制循环次数    int flag = 0;    while(++flag != 5)    { qDebug() << flag; //输出当前线程的线程ID qDebug() << QThread::currentThreadId() << "我是主类ID,创建和调用线程类的"; //运行到当前位置睡眠一秒 QThread::sleep(1);    }    //运行完成后推出两个线程并关闭窗口    m_cThread->quit();    m_cThread->wait(1);    m_thread->quit();    m_thread->wait(1);    this->close();}

注意:QThread::sleep在主线程使用时会导致主线程停止,如果设置的时间太长系统会当作是程序卡死,的情况,所以在主线程要么不使用sleep,要么在sleep时不操作程序窗口

总结

线程在很多时候是很有用的,当需要减少主线程负担时可以使用,需要后台重写某文件等情况可以使用,并且在线程运行时还不会影响主线程。当然了使用线程也得小心,如内存释放等问题,以及线程数量限制的问题(这里可以去了解线程池的用法)。

相关文档

Qt互斥锁(QMutex)、条件变量(QWaitCondition)讲解+QMutex实现多线程循环输出ABC(含源码+注释)
Qt互斥锁(QMutex)的使用、QMutexLocker的使用(含源码+注释)
QSemaphore的使用+QSemaphore实现循环输出ABC(含源码+注释)
QRunnable线程、QThreadPool(线程池)的使用(含源码+注释)

友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 ^o^/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除

狗狗宠物资料大全