我使用基于QScxmlStateMachine
的状态机。某些转换由 onEntry 处理程序中的代码自动触发,其他一些转换由外部事件(例如用户单击)触发。
状态机的执行是异步的。此代码未阻止:
m_statemachine->submitEvent("user_initialize", settings);
精细。我想知道的是如何完成状态机内部的处理。
第一个事件排队并将异步进入状态初始化,在这个状态 onEntry 代码中可以触发的事件怎么样,它们是否排队?
在处理下一次转换之前,internal event-loop是否可以处理其他一些GUI事件?
而且,我认为不是,状态机事件循环是一个单独的线程吗?
答案 0 :(得分:1)
第一个事件排队并将异步进入状态初始化,在这个状态onEntry代码中可以触发的事件怎么样,它们是否也排队了?
所有活动都排队。这些的Qt术语是发布的事件(而不是立即执行的发送的事件)。
并且,我认为不是,状态机事件循环是否在一个单独的线程中?
“内部”事件循环有点用词不当。状态机实际上在当前线程的事件循环上运行,但它会复制一些事件并在以后处理它们。
在处理下一次转换之前,内部事件循环是否可以处理其他一些GUI事件?
是。您只能保证状态机本身内的相对事件处理顺序。可以在传递给状态机的每个事件之间处理任意数量的事件。无论你正在做什么样的事件处理,情况总是如此。绕过它的唯一方法是发布更高优先级的事件。多个事件优先级有其自身的缺点,必须谨慎使用并理解如何在事件队列中实现优先级方案。