如何在QStateMachine中管理事件?

时间:2017-08-24 12:21:37

标签: qt qeventloop qstatemachine

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

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

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

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

1 个答案:

答案 0 :(得分:1)

  

第一个事件排队并将异步进入状态初始化,在这个状态onEntry代码中可以触发的事件怎么样,它们是否也排队了?

所有活动都排队。这些的Qt术语是发布的事件(而不是立即执行的发送的事件)。

  

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

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

  

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

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