推动MSM - Newbi

时间:2012-03-05 00:03:24

标签: boost

好吧,假设我有2个状态(s1和s2)。 s1可以通过事件e1和s1转到s2 s2可以通过事件e2转到s1。

现在,我们还假设只有在某些条件适用的情况下才会分别从s1和s2触发e1和e2。

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

即。 假设我在s2中并执行了s2中的所有代码而我没有触发e2然后我离开状态并且我点击了我的while循环结束现在我想回到s2继续从那里看看是否这个时间e2将开火。

1 个答案:

答案 0 :(得分:0)

简短的回答是:制作第三种事件,导致两种状态的内部转换,并将其发布在主要的无限循环中。

长的答案从问题为什么有人想要这样做开始?至少根据我的经验,状态机应该更像是一个事件驱动的概念,它对OUTSIDE事件作出反应。在状态机中使用轮询(它看起来像你的后面)并不是状态机所用的。我会在状态机外进行轮询(在你的情况下是主要的),当我得到一个事件然后将它发布到状态机。

对于状态来说,在一段时间之后设置定时器(再次在状态机外)以发布“超时事件”(或任何其他事件)也是常见的。在我的脑海中取消该请求退出请求它的状态的良好做法。即使它在某些情况下似乎无用,因为现在没有理由离开该州,它确实有助于实施退出该州的新事件的可怜的维护程序员然后撕裂他的头发想知道为什么他得到“超时事件”三州过渡。

如果您不熟悉状态机,我会强烈推荐Miro Samek的书:http://www.amazon.com/exec/obidos/ASIN/0750687061/quantumleap06-20