Boost 增强MSM-Newbi

Boost 增强MSM-Newbi,boost,Boost,假设我有两个状态(s1和s2)。 s1可以通过事件e1和 s2可以与事件e2一起转到s1 现在,我们还假设,如果某些条件适用,e1和e2仅分别从s1和s2触发 所以在main()中,我将首先使用start()启动状态机,然后将有一个无限循环。在这个循环中,我需要能够在状态机中保持与离开状态机相同的状态。我该怎么做 i、 e。 假设我在s2中,执行s2中的所有代码,但我没有触发e2,然后我离开了状态,我点击了while循环的末尾,现在我想回到s2继续,看看这次e2是否会触发。简短的回答是:生成第三

假设我有两个状态(s1和s2)。 s1可以通过事件e1和 s2可以与事件e2一起转到s1

现在,我们还假设,如果某些条件适用,e1和e2仅分别从s1和s2触发

所以在main()中,我将首先使用start()启动状态机,然后将有一个无限循环。在这个循环中,我需要能够在状态机中保持与离开状态机相同的状态。我该怎么做

i、 e。
假设我在s2中,执行s2中的所有代码,但我没有触发e2,然后我离开了状态,我点击了while循环的末尾,现在我想回到s2继续,看看这次e2是否会触发。

简短的回答是:生成第三类事件,导致两种状态的内部转换,并将其发布到您的无止境的主循环

答案很长,首先是一个问题:为什么会有人想这么做?至少在我的经验中,状态机应该更像是一个事件驱动的概念,对外部事件做出反应。在状态机中使用轮询(看起来像是您的后续操作)并不是状态机的真正用途。我会在状态机之外进行轮询(主要是在你的情况下),当我得到一个事件时,然后将其发布到状态机

对于一个状态来说,设置一个计时器(同样在状态机之外)以在一段时间后发布“超时事件”(或任何其他事件)也是很常见的。在我看来,在离开提出请求的国家时取消该请求是一种良好的做法。即使它在某些情况下看起来毫无用处,因为现在没有理由离开该状态,但它确实帮助了可怜的维护程序员,这些程序员实现了一个新事件,然后退出该状态,然后大发雷霆,想知道为什么他在三个状态转换之后得到了一个“超时事件”

如果你是国家机器新手,我强烈推荐米罗·萨梅克的书: