我正在尝试理解Qt的整个内部流程以及在使用不同线程时如何工作。
据我所了解(通过谷歌搜索和探索Qt源代码),如下所示:
1. 每个线程都有一个本地的“待处理事件列表”和一个本地的事件循环(如果我调用`exec`),它与该列表进行交互。
2. `QCoreApplication::postEvent(obj, e)`将对`(obj, e)`对附加到`obj`线程的“待处理事件列表”上。
3. 每个线程都有一个本地的“事件分发器”(`QAbstractEventDispatcher`特化),其目的是读取系统事件。因此,存在适用于不同平台的`QEventDispatchWin`、`QEventDispatchUnix`、`QEventDispatchSymbian`等等。对于`gui`事件,Qt还具有`QEventDispatchX11`(从`QEventDispatchUnix`继承)、`S60`(来自`Symbian`)等等。
考虑到所有这些,`exec`调用的工作方式如下:
如果调用了
需要考虑以下几点:
据我所了解(通过谷歌搜索和探索Qt源代码),如下所示:
1. 每个线程都有一个本地的“待处理事件列表”和一个本地的事件循环(如果我调用`exec`),它与该列表进行交互。
2. `QCoreApplication::postEvent(obj, e)`将对`(obj, e)`对附加到`obj`线程的“待处理事件列表”上。
3. 每个线程都有一个本地的“事件分发器”(`QAbstractEventDispatcher`特化),其目的是读取系统事件。因此,存在适用于不同平台的`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
的值。需要考虑以下几点:
- 系统事件从系统生成并作为QEvent翻译时,永远不会被推送/发布:它们直接发送到目标对象。
- 目标对象成员函数(
o.event()
)在与processEvent
发生的同一线程中被调用。
postEvent
是一个静态且线程安全的函数,那么QCoreApplication在这个事件处理系统中扮演什么角色?而QApplication呢?为什么必须尽快创建它们?- 为什么需要QApplication/QCoreApplication来获取系统事件,如果每个线程都有自己的“事件分发器”?