Qt多執行緒程式設計中的物件執行緒與函式執行執行緒

2021-07-16 18:57:46 字數 2813 閱讀 7967

為了更清楚的理解這些問題,在此特編了個小例子說明一下。首先定義乙個從qobject繼承的類someobject,包含乙個訊號somesignal和乙個成員函式callemitsignal,此函式用於傳送前面的somesignal訊號。定義如下:

// define object class

class someobject : public qobject

void callemitsignal() // 用於傳送訊號的函式

signals:

void somesignal();

};

然後再定義乙個從qthread繼承的執行緒類subthread,它包含乙個someobject的物件指標obj,另外有乙個slot函式somesolt,定義如下:

class subthread : public qthread  

virtual ~subthread()

public slots:

// slot function connected to obj's somesignal

void someslot();

public:

someobject * obj;

};

// slot function connected to obj's somesignal

void subthread::someslot()

else if (obj->thread() == this)

else

else if (qthread::currentthread() == this)

else

qdebug() << msg;

quit();

}

這裡someslot函式主要輸出了obj所在的執行緒和slot函式執行執行緒。

接著從subthread又繼承了3個執行緒類,分別是subthread1, subthread2, subthread3.分別實現執行緒的run函式。定義如下:

// define sub thread class 1  

class subthread1 : public subthread

; class subthread2 : public subthread

; class subthread3 : public subthread

;

在主程式中分別建立3個不同的執行緒並執行,檢視執行結果。

int main(int argc, char *argv)  

下面我們來分析不同寫法的程式,其obj物件所在的執行緒空間和someslot函式執行的執行緒空間分別是怎樣的。

首先看subthread1的實現:

// class subthread1  

subthread1::subthread1(qobject* parent)

: subthread(parent)

// reimplement run

void subthread1::run()

可以看到,obj是在建構函式中被建立的,那麼建立obj物件的執行緒也就是建立subthread1的執行緒,一般是主線程,而不是subthread1所代表的執行緒。同時由於obj和this(即t1)都位於主線程,所以someslot函式也是由主線程來執行的。

// class subthread2  

subthread2::subthread2(qobject* parent)

: subthread(parent)

// reimplement run

void subthread2::run()

同時,在connect函式中由於obj和this(這裡是t2)不是在同乙個執行緒中,因此會採用queuedconnection的方式,其slot函式由this物件所在的執行緒即主線程來執行。這裡有乙個特別容易誤解的地方,就是這個slot函式雖然是子執行緒subthread2的乙個成員函式,connect操作也是在子執行緒內完成的,但是該函式的執行卻不在子執行緒內,而是在主線程內。

那麼如果想讓相應的slot函式在子執行緒內執行,該如何做呢?在子執行緒的run函式中建立obj物件的同時,在執行connect時指定連線方式為directconnection,這樣就可以使slot函式在子執行緒中執行,因為directconnection的方式始終由sender物件的執行緒執行。如

// class subthread3  

subthread3::subthread3(qobject* parent)

: subthread(parent)

// reimplement run

void subthread3::run()

最後,該程式的執行結果應該是:

"subthread1::obj's thread is main thread; someslot executed in main thread;"   

"subthread2::obj's thread is sub thread; someslot executed in main thread;"

"subthread3::obj's thread is sub thread; someslot executed in sub thread;"

Qt多執行緒程式設計中的物件執行緒與函式執行執行緒

2017 05 10 16 40 25人閱讀收藏 編輯刪除 qt 24 作者同類文章x 而對於伺服器來說,多執行緒的這個特性太有用了,因為多執行緒使得伺服器可能同時響應多個客戶端的請求,所以現在伺服器大多採用多執行緒,所以才會造成我開始的誤解。不管是多執行緒,還是伺服器,qt中已經封裝好了特定的類,...

Qt中的多執行緒程式設計

qt中的多執行緒程式設計 qthread 類,該類提供了建立乙個新執行緒以及控制線程執行的各種方法。執行緒是通過 qthread run 過載函式開始執行的 在 qt 系統中,始終執行著乙個gui 主事件執行緒,這個主線程從視窗系統中獲取事件,並將它們分發到各個元件去處理。在 qthread 類中還...

Qt中的多執行緒程式設計

1.業務類 1.1要在子執行緒中處理的業務操作抽象成乙個類 subthreadwork 繼承於qobject 1.2在類subthreadwork中自定義乙個業務處理函式 dosubthreadwork 1.3在類subthreadwork中自宣告訊號 signalsubthreadwork 通過自...