第一種:繼承QThread類
方法描述
1。類MyThread繼承QThread,
2。重載MyThread中的run()函數(shù),在run()函數(shù)中寫入需要執(zhí)行的工作;
3。調(diào)用start()函數(shù)來啟動線程。
不是真的跨線程,子線程ID和主線程ID是同一個
QThread的原理:
1.重寫了QThread中的run()函數(shù),在run()函數(shù)中定義了需要的工作。
2.我們自定義的子線程調(diào)用start()函數(shù)后,便開始執(zhí)行run()函數(shù)。
3.run()函數(shù)是由主線程執(zhí)行。
如果你不信:
子類化的線程的槽函數(shù)中輸出當前線程的ID,而這個ID居然是主線程的ID!!
子類化的QThread只能執(zhí)行run()函數(shù)中的任務直到run()函數(shù)退出,而它的槽函數(shù)根本不會被自己的線程執(zhí)行。
第二種:QObject::moveToThread
方法描述:
1。worker類繼承QObject
2.在worker類中定義一個槽slot函數(shù)doWork(),這個函數(shù)中定義線程需要做的工作;
3.主線程中,新建一個Controller 繼承QThread的對象,使用moveToThread()方法將worker對象的事件循環(huán)全部交由Controller對象處理;
4.建立相關的信號函數(shù)和槽函數(shù)進行連接,然后發(fā)出信號觸發(fā)QThread的槽函數(shù),使其執(zhí)行工作。
這就是我要的子線程文章來源:http://www.zghlxwxcb.cn/news/detail-860121.html
#ifndef WORKER_H
#define WORKER_H
#include <QObject>
#include<QDebug>
#include<QThread>
class Worker:public QObject
{
Q_OBJECT
public:
Worker(QObject* parent = nullptr){}
public slots:
void doWork(int parameter) //doWork定義了線程要執(zhí)行的操作
{
qDebug()<<"hello start";
emit resultReady(parameter); //emit啥事也不干,是給程序員看的,表示發(fā)出信號
}
signals:
void resultReady(const int result); //線程完成工作時發(fā)送的信號
};
#endif // WORKER_H
//用于托管我的子線程文章來源地址http://www.zghlxwxcb.cn/news/detail-860121.html
#ifndef CONTROLLER_H
#define CONTROLLER_H
#include <QObject>
#include<QThread>
#include<QDebug>
class Controller : public QObject //controller用于啟動線程和處理線程執(zhí)行結果
{
Q_OBJECT
public:
QThread workerThread;
public:
Controller(QObject *parent= nullptr);
~Controller();
public slots:
void handleResults(const int rslt) //處理線程執(zhí)行的結果
{
qDebug()<<" current thread ID:"<<QThread::currentThreadId()<<'\n';
}
};
#endif // CONTROLLER_H
#include "controller.h"
#include <worker.h>
Controller::Controller(QObject *parent) : QObject(parent)
{
Worker *worker = new Worker;
worker->moveToThread(&workerThread); //調(diào)用moveToThread將該任務交給workThread
connect(this, SIGNAL(startThread(const int)), worker, SLOT(doWork(int))); //startThread信號發(fā)射后啟動線程工作
workerThread.start(); //啟動線程
qDebug()<<" current thread ID:"<<QThread::currentThreadId()<<'\n';
emit startThread(0);
}
Controller::~Controller() //析構函數(shù)中調(diào)用quit()函數(shù)結束線程
{
workerThread.quit();
workerThread.wait();
}
}
moveToThread方法
,是把我們需要的工作全部封裝在一個類中,將每個任務定義為一個的槽函數(shù),再建立觸發(fā)這些槽的信號,然后把信號和槽連接起來,
最后將這個類調(diào)用moveToThread方法交給一個QThread對象,
調(diào)用QThread的start()函數(shù)使其全權處理事件循環(huán)。于是,任何時候我們需要讓線程執(zhí)行某個任務,只需要發(fā)出對應的信號就可以。
其優(yōu)點是我們可以在一個worker類中定義很多個需要做的工作,然后發(fā)出觸發(fā)的信號線程就可以執(zhí)行。
相比于子類化的QThread只能執(zhí)行run()函數(shù)中的任務,
moveToThread的方法中一個線程可以做很多不同的工作(只要發(fā)出任務的對應的信號即可)
到了這里,關于qt創(chuàng)建線程的兩種方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!