2013-05-29 78 views
7

我想了解Qt的整個內部過程以及它如何在我使用不同的線程時工作。Qt主Gui和其他線程+事件循環

正如我瞭解(谷歌搜索和探索的Qt源代碼),是如下:

  • 每個線程都有當地的「當前事件列表」和本地事件循環(如果我打電話給exec )與該列表進行交互。
  • QCoreApplication::postEvent(obj, e)obj的線程的「待處理事件列表」上追加(obj, e)對。
  • 每個線程都有一個本地「事件調度器」(QAbstractEventDispatcher specializations),其目的是讀取系統事件。因此,對於不同的平臺,它存在一個QEventDispatchWin,一個QEventDispatchUnix,一個QEventDispatchSymbian等等。對於gui事件,Qt擁有也QEventDispatchX11(從QEventDispatchUnix繼承),S60(從Symbian)等

有了這一切記住,一個exec調用工作如下:

Thread's `exec`: 
├ create a QEventLoop object. 
└ call QEventLoop.exec() 
    └ call repeatedly eventDispatcher's processEvents with WaitForMoreEvents flag. 
    ├ call to QCoreApplication::sendPostedEvents 
    ├ while (!pending system events) 
    │ ├ read system event 
    │ ├ create an appropiate QEvent e and detect its target QObject o. 
    │ └ call to QCoreApplication::sendSpontaneousEvent(o, e) 
    └ call to QCoreApplication::sendPostedEvents 
     (for new generated user events in the previous step). 

如果quitexit被調用時,它將終止當前的processEvents調用,並返回exec,並將值傳遞給exit

幾點採取考慮:

  1. 系統事件從未被推/貼:當它們從系統中產生,並翻譯爲QEvents,它們直接sended到它的目標對象。
  2. processEvent發生的同一個線程中調用目標對象成員函數(o.event())。

而現在,疑惑道:

  1. 由於postEvent是靜態的,線程安全的功能,是否QCoreApplication在此事件處理系統中扮演什麼樣的角色?和QApplication?爲什麼他們必須儘快創建?
  2. 爲什麼QApplication/QCoreApplication對於獲取系統事件是必需的,如果每個線程都有自己的「事件調度程序」?

任何關於我的定位的更正都是值得歡迎的。

回答

2

爲了迴應第二個問題,「如果每個線程都有自己的」事件調度程序「,爲什麼QApplication/QCoreApplication必須獲取系統事件?

4.8 documenation狀態:

「請注意,QCoreApplication :: EXEC()必須始終從主線程,而不是從QThread的(執行main()的線程)呼籲在GUI應用程序。 ,主線程也稱爲GUI線程,因爲它是唯一允許執行與GUI相關的操作的線程。「

但對於一般QThreads - 你會發現提供的鏈接描述QThreads作爲QObject對象是圍繞主題的包裝所以QThreads,就像任何其他的QObject,要求QCoreApplication爲了協調與互動通知/事件,例如,當線程完成。

http://qt-project.org/forums/viewthread/14806

在Maya的文章中,她提供了其中任務被分配到的QThread代替[即使用信號/插槽內被限定並且不超負荷的示例run()方法]。通過這種方式,您可以清楚地看到QCoreAppli提供的主事件循環陽離子仍然起着關鍵作用。

正如你可能已經知道的那樣,圍繞QThreads這個網站的主題已經有大量的討論 - 而且Qt4已經有很好的文檔了......對於Qt5 =(

+1

對不起,您的回覆很快就回復了,直到今天我才意識到。 –