0

我正在尝试使用 Apache scxml 实现控制流。我的状态转换就像

<scxml initial="State1">

    <state id = "State1"><transition event="event1" target="State2"></state>
    <state id = "State2">
        <transition event="event2" target="State3">
        <transition event="event3" target="State4">
    </state>
   <state id = "State3">
        <transition event="event4" target="State2">
   </state>

   <state id = "State4">
        <transition event="event5" target="State2">
   </state>

   <state id = "State5"><transition target="State1">
</scxml>

作为状态机,它工作正常并且没有任何问题。但我有几个要求,我面临的问题

  1. 我必须检查每个状态中的外部事件,如果该事件为真,我必须进入循环的最后一个状态。实现这一目标的最佳方法是什么?

  2. 有可能当我在里面时,state2我可以去state4state5通过state3. state3在检查条件后,我是否可以触发事件或更改state4状态state5

上述两个问题似乎都有相同的解决方案,但我无法找出实现它们的最佳方法。

4

1 回答 1

0

检查外部事件 [...],如果该事件为真 [...] 进入循环的最后状态。

您可以通过将所有状态包装在父包装器中并从那里转换来最优雅地做到这一点。例如:

<scxml xmlns="http://www.w3.org/2005/07/scxml" initial="state1">
   <state id='all'>
     <!-- this will always be tested, no matter which child state you are in -->
     <transition event="externalevent" target="state5" />
     <state id="state1"><!-- ... --></state>
     <state id="state2"><!-- ... --></state>
     <state id="state3"><!-- ... --></state>
     <state id="state4"><!-- ... --></state>
     <state id="state5"><!-- ... --></state>
   </state>
</scxml>

有可能当我在时state2我可以去state4state5通过state3

您描述的模式似乎很糟糕,但是是的,这是可能的。您需要在进入状态的过程中设置一个标志,并使用该标志立即转换出来。例如,使用简单的Lua 数据模型(Apache SCXML 不支持,但为了清楚起见,此处使用):

 <datamodel>
   <data id="bounceTo" expr="-1" />
 </datamodel>

 <state id="state2">
   <transition event="bounce-3-4" target="state3">
     <assign location="bounceTo" expr="4" />
   </transition>
   <transition event="bounce-3-5" target="state3">
     <assign location="bounceTo" expr="5" />
   </transition>
 </state>

 <state id="state3">
   <transition cond="bounceTo==4" target="state4">
     <assign location="bounceTo" expr="-1" />
   </transition>
   <transition cond="bounceTo==5" target="state5">
     <assign location="bounceTo" expr="-1" />
   </transition>
 </state>

在 Apache SCXML 中设置、测试和清除数据值超出了我的理解范围。

但是,我必须问你为什么要这样做。state3 在我看来,从转换本身复制您可能想要的进入或退出操作,并让这些转换直接以状态 4 或 5为目标,这似乎要好得多。

于 2015-05-18T22:48:00.700 回答