(十三)QT的執行緒

2021-10-10 10:53:34 字數 2468 閱讀 5433

qt實際是有兩種執行緒寫法的:

第一種就是常見的寫法:繼承qthread類,重寫run函式,把需要子執行緒執行的任務放在run函式中,呼叫start,執行緒開始執行。

這種寫法有個缺點就是:需要執行緒執行的任務都要放在run函式中,如果你在run中放乙個signal,通知run函式外的槽函式執行某個操作,那麼這個槽函式就會在主線程中執行即使這個槽函式是在子執行緒類中的,也會在主線程中執行)。這對於使用訊號槽方式的qt來說是無法接受的,因此qt強烈建議大家不要使用這種方式。

乍一看,和第一種沒啥區別是吧,那麼我們讓這個槽函式發出乙個訊號出來,看下結果:

mainwindow.cpp檔案:由它啟動子執行緒

mainwindow::

mainwindow

(qwidget *parent)

:qmainwindow

(parent),ui

(new ui::mainwindow)

,mthread

(new mthread)

mthread.**件:

#include

class

mthread

:public qobject

;

mthread.cpp檔案:

#include

"mthread.h"

#include

"qthread"

#include

"qdebug"

mthread::

mthread

(qobject *parent)

:qobject

(parent)

void mthread::

creatthread()

void mthread::

slot_get_send()

void mthread::

slot_test_signal()

結果如下:

mainwindow threadid :

qthread

(0x230de578580

)creatthread threadid :

qthread

(0x230de578580

)slot_get_send threadid :

qthread

(0x230e1404ba0

)slot_test_signal threadid :

qthread

(0x230e1404ba0

)

主線程和子執行緒中的發出訊號的函式都在主線程中,子執行緒中的兩個槽函式都在子執行緒中執行。

這就告訴我們movetothread的兩個特點:

1.槽函式才是執行子執行緒工作的地方,千萬不要在其他非槽函式的函式中寫子執行緒工作!!(哪怕這些非槽函式就在子執行緒類中)

2.子執行緒類中的槽函式都在子執行緒中執行!

其實qt的執行緒寫法加上它的訊號槽,還建立了乙個比較方便的工作:可以在乙個類中定義很多個任務,然後發出不同的訊號,子執行緒就可以執行不同的槽函式。相比於繼承qthread只能執行run()函式中的乙個任務,movetothread的方法中乙個執行緒可以做很多不同的工作。

mainwindow.cpp檔案新增:

connect

(this

,&mainwindow::signal_mainwindow,mthread,

&mthread::slot_mainwindows)

;//mthread->creatthread();//原來的訊號遮蔽掉

emit signal_mainwindow()

;//mainwindow中增加新的訊號signal_mainwindow

mthread.cpp檔案新增:

void mthread::

slot_mainwindows()

執行結果:

mainwindow threadid :

qthread

(0x1af20d1ab90

)slot_mainwindows threadid :

qthread

(0x1af20d50c70

)

所以總的來說:

1.如果選擇——繼承qthread類,重寫run函式。請把所有需要子執行緒處理的事務都放在run函式中

2.如果選擇——movetothread。請把所有需要子執行緒處理的事務都放在槽函式中。(切記!切記!槽函式!)

1)子執行緒類中的槽函式都在子執行緒中執行,所以你可以在子執行緒中任意跳轉參函式

2)可以在乙個類中定義很多個任務,然後發出不同的訊號,子執行緒就可以執行不同的槽函式

執行緒 十三 ForkJoin

到這裡,關於 completablefuture 的基本使用你已經了解的差不多了,不知道你是否注意,我們前面說的帶有 sync 的方法是單獨起乙個執行緒來執行,但是我們並沒有建立執行緒,這是怎麼實現的呢?細心的朋友如果仔細看每個變種函式的第三個方法也許會發現裡面都有乙個 executor 型別的引數...

QT中的執行緒

qt中的執行緒是不可以執行ui內容的,一般情況,執行邏輯運算就可以,但是,如果讓執行緒中用到ui,就需要用到 訊號和槽 的機制了 如果執行緒用到 訊號和槽 執行緒的定義就需要放到主介面定義的檔案中了 q object 否則編譯出錯 部分 如下 ifndef proc h define proc h ...

QT執行緒的結束

感謝原作者的幫助!include include class workerthread public qthread workerthread void stop protected virtual void run q decl override locker超出範圍並釋放互斥鎖 signals ...