我想了解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).
如果quit
或exit
被調用時,它將終止當前的processEvents
調用,並返回exec
,並將值傳遞給exit
。
幾點採取考慮:
- 系統事件從未被推/貼:當它們從系統中產生,並翻譯爲QEvents,它們直接sended到它的目標對象。
- 在
processEvent
發生的同一個線程中調用目標對象成員函數(o.event()
)。
而現在,疑惑道:
- 由於
postEvent
是靜態的,線程安全的功能,是否QCoreApplication在此事件處理系統中扮演什麼樣的角色?和QApplication?爲什麼他們必須儘快創建? - 爲什麼QApplication/QCoreApplication對於獲取系統事件是必需的,如果每個線程都有自己的「事件調度程序」?
任何關於我的定位的更正都是值得歡迎的。
對不起,您的回覆很快就回復了,直到今天我才意識到。 –