本文只是講解如何使用,並不講解其中實現原理。
1.首先在Widget或者其他你認爲要用到地方包含相關的頭文件(以下皆是在Widget下用)
#include <QThread>
#include <QDebug> //方便打印
因Qt5的線程運用結合了信號與槽,這跟Qt4和C++本身的線程運用有點不一樣。
2.先添加一個自定義類,一定要繼承QObject類或者QWidget類有關的類,不然都沒有信號與槽的實現基礎,切記。參考如下圖
3.其次在在該類中寫上那些耗時間或者是打算利用QThread::sleep等延時函數的相關處理函數。
void go(){
doSomeing;
...
}
3.再在上圖的signals:寫上自定義的信號(這個信號視情況而寫,沒用上可以不寫,一般用於子線程向其他線程傳遞信息),
例如:
void runStart(void);
4.然後回到Widget類,在該類中也定義一個信號,此信號是用來啓動子線程
signals:
void start();
5.在Widget類中,定義倆個變量
private:
QThread *thread;
Run *run;
並在Widget的初始化函數進行初始化
thread = new QThread(this);
run = new Run(); //由於子線程的存活時間可能跟主線程的存活時間不一致,所以不指定父對象
run->moveToThread(thread); //將run類與thread進行“捆綁”
connect(this,&Widget::wStart,run,&Run::go); //進行信號與槽的綁定
thread->start(); //開啓線程
emit wStart(); //發出信號,啓動子線程的指定槽函數go
6.爲了方便回收子線程資源,可在自定義信號與槽來綁定,也可以在其析構函數中定義如下:
Widget::~Widget()
{
thread->quit();
thread->wait();
delete ui;
}
7.方便大家觀察現象,我另外在go和Widget函數中加上以下代碼
void Run::go()
{
qDebug() << "開始子線程";
QThread::sleep(1); //等待1秒
qDebug() << "子線程1秒過後";
QThread::sleep(1);
qDebug() << "子線程2秒過後";
QThread::sleep(1);
qDebug() <<" 子線程即將結束";
}
運行結果