0

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

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

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

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

4

1 回答 1

1

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

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

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

“内部”事件循环有点用词不当。状态机确实在当前线程的事件循环上运行,但它会复制一些事件并在以后处理它们。

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

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

于 2017-08-24T18:01:33.437 回答