我想了解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对于获取系统事件是必需的,如果每个线程都有自己的“事件调度程序”?
任何关于我的定位的更正都是值得欢迎的。
对不起,您的回复很快就回复了,直到今天我才意识到。 –