Qt 如何管理QStateMachine中的事件?
我使用基于的状态机。有些转换是由onEntry处理程序中的代码自动触发的,有些转换是由外部事件(如用户单击)触发的 状态机的执行是异步的。此代码未阻塞:Qt 如何管理QStateMachine中的事件?,qt,qeventloop,qstatemachine,Qt,Qeventloop,Qstatemachine,我使用基于的状态机。有些转换是由onEntry处理程序中的代码自动触发的,有些转换是由外部事件(如用户单击)触发的 状态机的执行是异步的。此代码未阻塞: m_statemachine->submitEvent("user_initialize", settings); 好的。我想知道的是状态机内部的处理是如何完成的。 第一个事件已排队,并将以异步方式进入初始化状态,那么在此状态下可能触发的事件呢?重试代码,它们也排队了吗? 在处理下一个转换之前,是否可以处理一些其他GUI事件? 而且,我
m_statemachine->submitEvent("user_initialize", settings);
好的。我想知道的是状态机内部的处理是如何完成的。第一个事件已排队,并将以异步方式进入初始化状态,那么在此状态下可能触发的事件呢?重试代码,它们也排队了吗?
在处理下一个转换之前,是否可以处理一些其他GUI事件?
而且,我假设不是,状态机事件循环是否在一个单独的线程中 第一个事件已排队,并将以异步方式进入初始化状态,那么在这种状态下可能触发的事件呢 所有事件都已排队。这些事件的Qt术语是POST事件(与立即执行的已发送事件相反) 而且,我假设不是,状态机事件循环是否在一个单独的线程中 “内部”事件循环有点用词不当。状态机实际上是在当前线程的事件循环上运行的,但它会复制一些事件并在以后处理它们 在处理下一个转换之前,内部事件循环是否可以处理其他一些GUI事件
对。只保证状态机本身内的相对事件处理顺序。在每个传递到状态机的事件之间可以处理任意数量的事件。不管你在做什么样的事件处理,情况总是这样。绕过它的唯一方法是发布更高优先级的事件。多个事件优先级有其自身的缺点,必须谨慎使用,并了解优先级方案在事件队列中的实现方式。因此:QStateMachine运行自己的事件循环。这相当令人困惑,实际上不可能在同一线程中同时运行2个QEventLoop。感谢您的回答,据我所知,所有默认转换都使用Qt事件系统,而不是信号/插槽系统,对吗?它并没有说它运行一个单独的
QEventLoop
实例。它确实运行自己的事件队列,“循环”一词肯定有点误用。信号/插槽系统的使用将是一个实施细节,用户不关心。机器实现了UML语义。它如何做到这一点主要取决于它。