Переход состояния из состояния в 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>
как конечный автомат, он работает нормально и работает без каких-либо проблем. Но у меня есть пара требований, по которым я сталкиваюсь с проблемами в
Я должен проверить внешнее событие в каждом состоянии, и если это событие истинно, я должен перейти к последнему состоянию цикла. что было бы лучшим способом достичь этого?
Возможно, что когда я в
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.