QT 執行緒間通訊

2021-08-25 13:13:53 字數 1850 閱讀 2709

在 qt 系統中,執行著乙個gui 主事件執行緒,這個主線程從視窗系統中獲取事件,並將它們分發到各個元件去處理。在 qthread 類中有一種從非主事件執行緒中將事件提交給乙個物件的方法,也就是 qthread::postevent()方法,該方法提供了qt 中的一種 thread-safe 的事件提交過程。提交的事件被放進乙個佇列中,然後 gui 主事件執行緒被喚醒並將此事件發給相應的物件,這個過程與一般的視窗系統事件處理過程是一樣的。當事件處理過程被呼叫時,是在主事件執行緒中被呼叫的,而不是在呼叫qthread::postevent 方法的執行緒中被呼叫。

1.、系統定義的事件的提交

在 qt 系統中,定義了很多種類的事件,如定時器事件、滑鼠移動事件、鍵盤事件、視窗控制項事件等。通常,事件都來自底層的視窗系統。qt 的主事件迴圈函式從系統的事件佇列中獲取這些事件,並將它們轉換為 qevent,然後傳給相應的 qobjects 物件。

如下所示:

qwidget *mywidget;

void mythread::run()

在mythread執行緒中傳送重畫事件給mywidget窗體類。

mywidget的paintevent事件響應會被自動呼叫,用以響應mythread傳送過來的重畫事件。

void mywidget::paintevent(qpaintevent*)

如下所示:

userevent類是使用者自定義的事件類,其事件標識為346798,顯然不會與系統定義的事件型別衝突。

class userevent : public qcustomevent  //使用者自定義的事件類

qstring str() const

private:

qstring sz;   };

userthread類是由qthread類繼承而來的子類,在該類中除了定義有關的變數和執行緒控制函式外,最主要的是定義執行緒的啟動函式userthread::run(),在該函式中建立了乙個使用者自定義事件userevent,並利用qthread類的postevent函式提交該事件給相應的接收物件。

class userthread : public qthread   //使用者定義的執行緒類

void userthread::run()   //執行緒類啟動函式,在該函式中建立了乙個使用者自定義事件

userwidget類是使用者定義的用於接收自定義事件的qwidget類的子類,該類利用slotgo()函式建立了乙個新的執行緒recv(userthread類),當收到相應的自定義事件(即id為346798)時,利用customevent函式對事件進行處理。

void userwidget::slotgo()  //使用者定義控制項的成員函式

void userwidget::customevent(qcustomevent *e)  //使用者自定義事件處理函式

} 在這個例子中,userwidget物件中建立了新的執行緒userthread,使用者可以利用這個執行緒實現一些週期性的處理(如接收底層發來的訊息等),一旦滿足特定條件就提交乙個使用者自定義的事件,當userwidget物件收到該事件時,可以按需求做出相應的處理,而一般情況下,userwidget物件可以正常地執行某些例行處理,而完全不受底層訊息的影響。

qt多執行緒程式的編譯

先決條件:有編譯成功的多執行緒庫 如libqt-mt.so(qt庫)或 libqte-mt.so(qte庫)

windows下:在qconfig.h 檔案中增加乙個選項來定義巨集 qt_thread_support

linux下:在makefile中的鏈結選項中加入多執行緒庫-lqt-mt或-lqte-mt,在編譯選項中增加-dqt_thread_support 來增加執行緒支援巨集 qt_thread_support。

詳細見:

Qt執行緒間通訊 訊號與槽通訊

執行緒間通訊 1.自定義事件 postevent 2.訊號與槽 本質也是通過自定義事件實現的 注意 每個執行緒都有自己的事件迴圈 下面先說明下訊號與槽的通訊 下面這個程式的執行截圖 此程式的邏輯 主線程有乙個qprogressbar。有乙個子執行緒,把主線程裡面的qprogressbar傳入子執行緒...

執行緒間通訊

執行緒間通訊 多個執行緒在操作統一資源,但各個執行緒操作的動作不同。資源 class res class input implements runnable public void run else x x 1 2 class output implements runnable public vo...

執行緒間通訊

執行緒間的通訊 在乙個多執行緒的應用程式中,所有執行緒共享程序資源,協同工作。所以,執行緒之間的通訊是編寫多執行緒 應用的必不可少的環節。執行緒之間的通訊包括互斥 同步等,它是多 執行緒設計中最難控制的部分,也是關鍵部分。執行緒間的互斥 1 臨界區 在乙個多執行緒 的應用程式中,可能存在這樣的危險 ...