我试图了解 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).
如果quitorexit被调用,它结束当前processEvents调用并exec返回传递给的值exit。
需要考虑的几点:
- 系统事件从不推送/发布:当它们从系统生成并转换为 QEvents 时,它们会直接发送到其目标对象。
- 目标对象成员函数 (
o.event()) 在发生的同一线程中调用processEvent。
现在,怀疑:
- 既然
postEvent是静态和线程安全的函数,那么 QCoreApplication 在这个事件处理系统中扮演什么角色呢?QApplication?为什么它们必须尽快创建? - 如果每个线程都有自己的“事件调度程序”,为什么 QApplication/QCoreApplication 必须获取系统事件?
欢迎对我的假设进行任何更正。