QStateMachine 中的事件是如何管理的?

How are managed the events in QStateMachine?

我使用基于 QScxmlStateMachine 的状态机。一些转换由 onEntry 处理程序中的代码自动触发,另一些由外部事件(例如用户点击)触发。

状态机的执行是异步的。此代码未阻塞:

m_statemachine->submitEvent("user_initialize", settings);

很好。我想知道的是当时状态机内部的处理是如何进行的。
第一个事件排队,将异步进入initializing状态,在onEntry代码中可以触发的事件呢?也排队了?
internal event-loop 是否可以在处理下一个转换之前处理一些其他 GUI 事件?
而且,我假设不是,状态机事件循环是否在单独的线程中?

This first event is queued and will asynchronously enter in a state initializing, what about the events that could be triggered in this state onEntry code, are they queued too ?

所有事件都已排队。这些的 Qt 术语是 posted 事件(与立即执行的 sent 事件相反)。

And, I assume not, is the state-machine event-loop in a separate thread ?

"internal" 事件循环有点用词不当。状态机确实运行在当前线程的事件循环上,只是它复制了一些事件并稍后处理。

Does the internal event-loop could process some other GUI events before processing the next transition?

是的。您只能保证状态机本身内的相关事件处理顺序。在传送到状态机的每个事件之间可以处理任意数量的事件。无论您正在进行何种事件处理,情况总是如此。绕过它的唯一方法是 post 更高优先级的事件。多个事件优先级有其自身的缺点,必须谨慎使用并了解优先级方案在事件队列中的实现方式。