QT源碼之Qt信號槽機制與事件機制的聯繫

QT源碼之Qt信號槽機制與事件機制的聯繫是本文要介紹的內容,通過解決一個問題,從中分析出的理論,先來看內容。

本文就是來解決一個問題,就是當signal和slot的連接爲Qt::QueuedConnection,這時候這個連接是怎麼分發處理的。下面就結合一下Qt的源代碼來分析一下。

  1. view plaincopy to clipboardprint?  
  2. if ((c->connectionType == Qt::AutoConnection     
  3.      && (currentThreadData != sender->d_func()->threadData     
  4.          || receiver->d_func()->threadData != sender->d_func()->threadData))     
  5.     || (c->connectionType == Qt::QueuedConnection)) {     
  6.     queued_activate(sender, signal, *c, argv);     
  7.     continue;     
  8. } else if (c->connectionType == Qt::BlockingQueuedConnection) {     
  9.     blocking_activate(sender, signal, *c, argv);     
  10.     continue;     
  11. }    
  12. if ((c->connectionType == Qt::AutoConnection  
  13.      && (currentThreadData != sender->d_func()->threadData  
  14.          || receiver->d_func()->threadData != sender->d_func()->threadData))  
  15.     || (c->connectionType == Qt::QueuedConnection)) {  
  16.     queued_activate(sender, signal, *c, argv);  
  17.     continue;  
  18. } else if (c->connectionType == Qt::BlockingQueuedConnection) {  
  19.     blocking_activate(sender, signal, *c, argv);  
  20.     continue;  
  21. }  

這段代碼的意思是:當前connectionType爲Qt::AutoConnection並且,signal和slot不在一個線程或者是signal和不再當前線程中;或者是c->connectionType爲 Qt::QueuedConnection這時候調用函數

queued_activate,如果c->connectionType 爲Qt::BlockingQueuedConnection則調用函數blocking_activate

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

queued_activate函數很簡單,就是對參數轉換一下,然後調用   

  1. QCoreApplication::postEvent(c.receiver, new QMetaCallEvent(c.method,sender,signal,nargs,types,args,semaphore)); 

注意: postEvent第二個參數是QMetaCallEvent。這樣這個signal-slot的connection就發送到receiver的消息隊列中去了。

接下來消息隊列如何處理QMetaCallEvent,請參考QT源碼解析剖析Qt事件機制原理(詳解 QT 源碼之 Qt 事件機制原理

後記:通過這種方法Qt實現了跨線程的signal-slot傳遞,並且這種signal-slot機制的傳遞是利用消息隊列,所以說是線程安全的。

小結:關於QT源碼之Qt信號槽機制與事件機制的聯繫的問題介紹完了,希望本文對你有幫助。

發佈了7 篇原創文章 · 獲贊 13 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章