Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 如何管理QStateMachine中的事件?_Qt_Qeventloop_Qstatemachine - Fatal编程技术网

Qt 如何管理QStateMachine中的事件?

Qt 如何管理QStateMachine中的事件?,qt,qeventloop,qstatemachine,Qt,Qeventloop,Qstatemachine,我使用基于的状态机。有些转换是由onEntry处理程序中的代码自动触发的,有些转换是由外部事件(如用户单击)触发的 状态机的执行是异步的。此代码未阻塞: m_statemachine->submitEvent("user_initialize", settings); 好的。我想知道的是状态机内部的处理是如何完成的。 第一个事件已排队,并将以异步方式进入初始化状态,那么在此状态下可能触发的事件呢?重试代码,它们也排队了吗? 在处理下一个转换之前,是否可以处理一些其他GUI事件? 而且,我

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

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

m_statemachine->submitEvent("user_initialize", settings);
好的。我想知道的是状态机内部的处理是如何完成的。
第一个事件已排队,并将以异步方式进入初始化状态,那么在此状态下可能触发的事件呢?重试代码,它们也排队了吗?
在处理下一个转换之前,是否可以处理一些其他GUI事件?
而且,我假设不是,状态机事件循环是否在一个单独的线程中

第一个事件已排队,并将以异步方式进入初始化状态,那么在这种状态下可能触发的事件呢

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

而且,我假设不是,状态机事件循环是否在一个单独的线程中

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

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


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

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