QT多線程moveToThread使用簡單例子

  Qt中我經常是重寫QThread中的run函數來實現多線程的使用,今天教大家使用使用比較新的moveToThread 函數來教教大家來編寫多線程的例子。

   這個例子我沒有使用ui界面編程,只是純代碼輸出:

   先看看例子的效果吧:

  

先看看主函數部分:

#include <QCoreApplication>
#include <QThread>

#include"myt.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    myT mytestThread;

    mytestThread.open();
    QThread::sleep(5);
    mytestThread.close();

    return a.exec();
}

啓動線程後,5秒鐘後,關閉線程,所以纔有上面的結果:

首先我們創建一個  myFirstThread 類繼承與 QObject

#ifndef MYFIRSTTHREAD_H
#define MYFIRSTTHREAD_H

#include <QObject>

class myFirstThread : public QObject
{
    Q_OBJECT
public:
    explicit myFirstThread(QObject *parent = nullptr);

    void closeThread();
signals:

public slots:
    void startThreadSlot();
private:
    volatile bool isStop;
};

#endif // MYFIRSTTHREAD_H

對應cpp:

#include "myfirstthread.h"
#include <QDebug>
#include <QThread>
myFirstThread::myFirstThread(QObject *parent) : QObject(parent)
{
    isStop = true;
}

void myFirstThread::closeThread()
{
    isStop = false;
}

void myFirstThread::startThreadSlot()
{
    while(1)
    {
        if(isStop == false)
        {
            return;
        }

        qDebug()<<"MyThread::startThreadSlot QThread::currentThreadId()=="<<QThread::currentThreadId();
        QThread::sleep(1);
    }


}

創建第二個類 myT 類繼承與 QObject  (這裏說明下,如果你創建是界面工程的話,可以把這個寫到對應界面的類中)

#ifndef MYT_H
#define MYT_H

#include <QObject>
#include "myfirstthread.h"
#include <QThread>
class myT : public QObject
{
    Q_OBJECT
public:
    explicit myT(QObject *parent = nullptr);

    void open();
    void close();

signals:

public slots:
    void openThreadSlot();
    void closeThreadSlot();
    void finishedThreadSlot();
private:
    myFirstThread * firstThread;
    QThread * thread;
};

#endif // MYT_H

 對應的cpp

#include "myt.h"
#include<QDebug>
myT::myT(QObject *parent) : QObject(parent)
{
    //
    qDebug() << tr("開始線程了");
    firstThread = new myFirstThread;
    thread = new QThread(this);
    firstThread->moveToThread(thread); //將創建的對象移到線程容器中
    connect(thread,&QThread::finished,firstThread,&myFirstThread::deleteLater); //刪除
    connect(thread,&QThread::started,firstThread,&myFirstThread::startThreadSlot); //開啓線程
    connect(thread,&QThread::finished,this,&myT::finishedThreadSlot); //完成
}

void myT::open()
{
    openThreadSlot();
}

void myT::close()
{
    closeThreadSlot();
}

void myT::openThreadSlot()
{
    thread->start();
    qDebug() << "mainWidget QThread::currentThreadId()=="<<QThread::currentThreadId();
}

void myT::closeThreadSlot()
{
    qDebug() << tr("關閉線程");
    if(thread->isRunning())
    {
        firstThread->closeThread(); //關閉線程  這裏調用關閉
        thread->quit();  //退出循環事件
        thread->wait();  //釋放線程槽函數資源
    }
}

void myT::finishedThreadSlot()
{
   qDebug() << tr("觸發了函數finished 123");
}

這樣就是最後的結果了,你懂了嗎,喜歡的可以關注喲。

參考:

https://blog.csdn.net/gongjianbo1992/article/details/85929958

https://blog.csdn.net/naibozhuan3744/article/details/81201502

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章