我试图了解 Qt 的整个内部过程以及当我使用不同的线程时它是如何工作的。
据我了解(谷歌搜索和探索 Qt 源代码),如下所示:
exec
每个线程都有一个本地“待处理事件列表”和一个与该列表交互的本地事件循环(如果我调用)。QCoreApplication::postEvent(obj, e)
将该对附加到's 线程(obj, e)
的“待处理事件列表”中。obj
- 每个线程都有一个本地“事件调度程序”(
QAbstractEventDispatcher
专门化),其目的是读取系统事件。因此,对于不同的平台,它存在 aQEventDispatchWin
、 aQEventDispatchUnix
、 aQEventDispatchSymbian
等等。对于gui
事件,Qt 也有QEventDispatchX11
(inherits fromQEventDispatchUnix
)、S60
(fromSymbian
) 等。
考虑到所有这些,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
orexit
被调用,它结束当前processEvents
调用并exec
返回传递给的值exit
。
需要考虑的几点:
- 系统事件从不推送/发布:当它们从系统生成并转换为 QEvents 时,它们会直接发送到其目标对象。
- 目标对象成员函数 (
o.event()
) 在发生的同一线程中调用processEvent
。
现在,怀疑:
- 既然
postEvent
是静态和线程安全的函数,那么 QCoreApplication 在这个事件处理系统中扮演什么角色呢?QApplication?为什么它们必须尽快创建? - 如果每个线程都有自己的“事件调度程序”,为什么 QApplication/QCoreApplication 必须获取系统事件?
欢迎对我的假设进行任何更正。