為了更清楚的理解這些問題,在此特編了個小例子說明一下。首先定義乙個從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 通過自...