Qt之先用了再說系列-多線程方式2

 

繼Qt之先用了再說系列-多線程方式2多線程

  本次說說在Qt裏多線程使用第2種方式,也是qt官方比較推薦用的方式,相對與直接繼承QThread 重寫run方法中靈活了一些,若是第一次使用可能會轉不灣來,沒有直接重寫run來的方便些,等等你多用幾遍你本身也會分辨那種適合本身了。。。。函數

    好了  ,開始準備工做。。。。線程

     開始以前,想說一下,,, 不少時候要達到某種目的,咱們總要重寫某些函數,,好比,你點擊窗體關閉的時候,你但願點擊關閉按鈕須要彈出對話框用二次確認是否真關閉窗口,那這個時候怎麼辦呢?這個時候咱們就須要重寫closeEvent函數,這樣就能達到咱們的目的了。而closeEvent從哪兒來的,就是從繼承過來的,,因此。。。咱們開始說線程對象

 

  1>先建立一個類,記住必定要繼承QObjectblog

//這是頭文件.h
#include<QObject> class A:public QObject //這裏一要繼承QObject { public: //構造函數 // 析構函數

//咱們但願子線程運行的函數,這裏我隨便寫了3個 public slots: void onThreadFun1(); //成員函數1,隨便命名 void onThreadFun2(); //成員函數2,隨便命名 void onThreadFun3(); //成員函數3,隨便命名 }
//這是源文件.cpp

析構,構造....省略

void A::OnThreadFun1()
{
  qDebug()<<"子線程運行1";
}

void A::OnThreadFun2()
{
qDebug()<<"子線程運行2";
}

void A::OnThreadFun3()
{
qDebug()<<"子線程運行3";
}

 

 

  2>上面建立好了這類之後,接下來我看看如何調用纔會在子線程中運行,看看跟重載run是否同樣繼承

爲了說明,假設有個B類,這個類,就至關與我用嚮導創造出來的那個默認的widget類同樣,你就把他當作widget就能夠了get

按照下面6個步驟填寫,只要一執行到步驟6,onThreadFun1(),onThreadFun2(),onThreadFun3(), 就會在子線程中運行了,步驟6至關於run中使用start()函數同樣。qt

 

#include "A.h"  //包含咱們寫的頭文件
#include <QThread>  //線程類,必須包含

int main()
{
    A a;                      //步驟1:聲明一個對象
   QThread thread1;  //步驟2:聲明一個線程對象

    a.moveToThread(thread1);  //步驟3:把a這個對象移動到thread1線程中
    thread1.start();      // 步驟4:開啓線程,此時線程並無執行,只是開啓,先無論,記住步驟

   //假設有個B類,裏面有個信號click,爲了簡單說明
    connect(b,&B::click,a,&A::onThreadFun1);   //步驟5:鏈接A類,咱們寫的函數
    connect(b,&B::click,a,&A::onThreadFun2);   //步驟5:鏈接A類,咱們寫的函數
    connect(b,&B::click,a,&A::onThreadFun3);   //步驟5:鏈接A類,咱們寫的函數
    
    
    emit b.click();  //步驟6:發射信號,至關與重寫run函數中,用start()開啓同樣    
    
}

  

 

 結語:此類多線程方法相對與重寫run函數會複雜一點點,可是能夠看到,子線程運行的函數有3個或者還有更多,看你本身喜歡。。。相對與重寫run中,只有run中才是子線程是否是多了點好處。。。。。。it

 

   機制:  經過發射信號,槽函數onThreadFun1(),onThreadFun2(),onThreadFun3(),接受到信號運行,此時運行線程會是子線程。class

   核心:a.moveToThread(thread1);   thread1.start();  正由於有了這兩句,槽函數才能在子線程中運行。。。

 

學會方法:,,,多寫幾回,理解理解就ok了,第一次是很痛苦的,爲何他要這麼作。。。。。。越深究,還有connect的第5個參數呢,,什麼?還有第5個參數。。。。。。

 

先用了再說。。。。。。

相關文章
相關標籤/搜索