【问题标题】:Boost MSM - Newbi提升 MSM - Newbi
【发布时间】:2012-03-05 00:03:23
【问题描述】:

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

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

所以在 main() 中,我将首先使用 start() 启动状态机,然后会有一个无限循环。在那个循环中,我需要能够以我离开它的相同状态继续进入状态机。我该怎么做?

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

【问题讨论】:

    标签: boost


    【解决方案1】:

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

    长答案始于为什么有人想这样做?至少根据我的经验,状态机应该更像是一个事件驱动的概念,它对 OUTSIDE 事件做出反应。在状态机中使用轮询(它看起来像你所追求的)并不是状态机的真正用途。我会在状态机之外进行轮询(在你的情况下是 main ),当我收到一个事件时,然后将其发布到状态机。

    状态设置计时器(同样在状态机之外)在一定时间后发布“超时事件”(或任何其他事件)也很常见。在我看来,在退出请求它的状态时取消该请求是一种很好的做法。即使它在某些情况下看起来没用,因为现在没有理由离开状态,它肯定会帮助可怜的维护程序员,他们实现了一个退出状态的新事件,然后他的头发想知道为什么他得到一个“超时事件”三状态稍后过渡。

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

    【讨论】:

      猜你喜欢
      • 2012-03-22
      • 1970-01-01
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多