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

Posted

技术标签:

【中文标题】QStateMachine 中的事件是如何管理的?【英文标题】:How are managed the events in QStateMachine? 【发布时间】:2018-02-02 07:56:51 【问题描述】:

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

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

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

很好。我想知道的是状态机内部的处理是如何完成的。 这第一个事件是排队的,并且会异步进入一个状态initializing,那么可以在这个状态onEntry代码中触发的事件呢,他们也排队了吗?internal event-loop 是否可以在处理下一个转换之前处理一些其他 GUI 事件? 而且,我认为不是,状态机事件循环是否在单独的线程中?

【问题讨论】:

【参考方案1】:

第一个事件是排队的,会异步进入一个初始化的状态,那么在这个状态的onEntry代码中可以触发的事件呢,是不是也排队了?

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

而且,我认为不是,状态机事件循环是否在单独的线程中?

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

内部事件循环是否可以在处理下一个转换之前处理一些其他 GUI 事件?

是的。您只能保证状态机本身内的相对事件处理顺序。在传递给状态机的每个事件之间可以处理任意数量的事件。无论您在做什么类型的事件处理,情况总是如此。规避它的唯一方法是发布更高优先级的事件。多个事件优先级有其自身的缺点,必须谨慎使用并了解优先级方案在事件队列中的实现方式。

【讨论】:

所以doc statement : A QStateMachine 运行自己的事件循环。 相当混乱,实际上不可能在同一线程中同时运行 2 个 QEventLoop .感谢您的回答,据我了解,所有默认转换都使用 Qt 事件系统而不是信号/插槽系统,对吗? 它并没有说它运行QEventLoop 的单独实例。它确实运行自己的事件队列,“循环”这个词肯定被误用了一点。信号/槽系统的使用将是一个实现细节,与用户无关。机器实现 UML 语义。它如何做到这一点主要取决于它。

以上是关于QStateMachine 中的事件是如何管理的?的主要内容,如果未能解决你的问题,请参考以下文章

使用 QStateMachine 在菜单屏幕之间切换

QStateMachine 如何在不同的 QState 中显示和隐藏 QGraphicsView 和 QObject

同步 QStateMachine

您如何管理 UINavigationController 视图中的事件以切换视图?

使用 OnClick 事件更改场景

Event System 事件系统