QT原始碼之Qt訊號槽機制與事件機制的聯絡

2021-09-08 14:14:13 字數 1693 閱讀 1605

qt原始碼之qt訊號槽機制與事件機制的聯絡是本文要介紹的內容,通過解決乙個問題,從中分析出的理論,先來看內容。

本文就是來解決乙個問題,就是當signal和slot的連線為qt::queuedconnection,這時候這個連線是怎麼分發處理的。下面就結合一下qt的源**來分析一下

view plaincopy to clipboardprint?  

if ((c->connectiontype ==qt::autoconnection

&& (currentthreaddata != sender->d_func()->threaddata

|| receiver->d_func()->threaddata != sender->d_func()->threaddata))

|| (c->connectiontype ==qt::queuedconnection))

else

if (c->connectiontype ==qt::blockingqueuedconnection)

if ((c->connectiontype ==qt::autoconnection

&& (currentthreaddata != sender->d_func()->threaddata

|| receiver->d_func()->threaddata != sender->d_func()->threaddata))

|| (c->connectiontype ==qt::queuedconnection))

else

if (c->connectiontype ==qt::blockingqueuedconnection)

這段**的意思是:當前connectiontype為qt::autoconnection並且,signal和slot不在乙個執行緒或者是signal和不再當前執行緒中;或者是c->connectiontype為 qt::queuedconnection這時候呼叫函式

queued_activate,如果c->connectiontype 為qt::blockingqueuedconnection則呼叫函式blocking_activate

我們當queued_activate和blocking_activate一樣就可以了。

queued_activate函式很簡單,就是對引數轉換一下,然後呼叫  

注意: postevent第二個引數是qmetacallevent。這樣這個signal-slot的connection就傳送到receiver的訊息佇列中去了。

接下來訊息佇列如何處理qmetacallevent,請參考qt原始碼解析剖析qt事件機制原理(詳解 qt 原始碼之 qt 事件機制原理)

後記:通過這種方法qt實現了跨執行緒的signal-slot傳遞,並且這種signal-slot機制的傳遞是利用訊息佇列,所以說是執行緒安全的。

小結:關於qt原始碼之qt訊號槽機制與事件機制的聯絡的問題介紹完了,希望本文對你有幫助。

QT訊號與槽機制

qt訊號與槽 posted on 2010 04 08 15 37 feisky 訊號與槽作為qt的核心機制在qt程式設計中有著廣泛的應用,本文介紹了訊號與槽的一些基本概念 元物件工具以及在實際使用過程中應注意的一些問題。qt是乙個跨平台的c gui應用構架,它提供了豐富的視窗部件集,具有物件導向 ...

Qt 訊號與槽機制

下部分 來自於我自己新增了傳遞引數的部分 ifndef my object define my object include define my slots define my signals protected define my emit class myobject struct metaob...

Qt訊號與槽機制原始碼分析與總結

斷開連線 注意事項 訊號與槽用於兩個物件之間的通訊,訊號和槽機制是qt的核心特徵,也是qt不同於其他開發框架的最突出的特徵。在gui程式設計中,當改變了乙個部件時,總希望其他部件也能了解到該變化。更一般來說,我們希望任何物件都可以和其他物件進行通訊。注意 傳送的訊號的引數一定要比其對應的槽方法的引數...