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