教你簡單幾步使用Qt5.12的多線程技術

本文只是講解如何使用,並不講解其中實現原理。

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() <<" 子線程即將結束";
}

運行結果

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