Переход состояния из состояния в scxml

Я пытаюсь реализовать поток управления с помощью 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 Я могу пойти в state4 или же state5 с помощью state3, Возможно ли, что я могу запустить событие или изменить состояние state3 после проверки условий, чтобы перейти к state4 или же state5?

Обе проблемы, описанные выше, похоже, имеют одно и то же решение, но я не могу найти лучший способ их реализации.

1 ответ

Решение

Проверьте внешнее событие […] и, если это событие истинно […], перейдите в последнее состояние цикла.

Вы можете сделать это наиболее элегантно, обернув все состояния в родительской оболочке и перейдя оттуда. Например:

<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 Я могу пойти в state4 или же state5 с помощью 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.

Другие вопросы по тегам