Apache Commons SCXML State Machine Framework - PullRequest
0 голосов
/ 11 сентября 2009


Я пытаюсь определить конечный автомат для приложения Java, используя Apache SCXML. Тем не менее, я столкнулся с проблемой, и я не уверен, происходит ли это из-за структуры SCXML или я что-то делаю неправильно. Я основываю свое тестовое приложение на следующем примере (без бита Android):
http://commons.apache.org/scxml/usecases/scxml-stopwatch-on-android.html

Файл StopWatch.java (http://commons.apache.org/scxml/xref-test/org/apache/commons/scxml/env/StopWatch.html)

public class StopWatch extends AbstractStateMachine {
    public void reset() {

    }

    public void running() {
    }

    public void paused() {
    }

    public void stopped() {
    }
}

Проблема в том, что вышеуказанные состояния вызываются только один раз за переход. Это правильно? Разве функция состояния не должна вызываться непрерывно, пока конечный автомат остается в заданном состоянии?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 17 февраля 2011

Привет на всякий случай, если другие люди найдут этот вопрос.

Приведенный выше пример работает только в контексте определенного конечного автомата пример.

Состояния не переходят автоматически, поскольку они охраняются событиями. Таким образом, только если конечный автомат находится в состоянии A, и определенное событие перехода запускается, конечный автомат продвигается. Это можно увидеть во фрагменте ниже

<state id="reset">
    <transition event="watch.start" target="running"/>
</state>

Как дополнительное примечание, выполнение метода с тем же именем, что и состояние, как определено в примере StopWatch, защищено EventListener, определенным в самом AbstractStateMachine. В рамках метода инициализации зарегистрирован новый слушатель.

engine.addListener(stateMachine, new EntryListener());

Этот слушатель вызывает метод с соответствующим именем состояния onEntry для нового состояния

public void onEntry(final TransitionTarget entered) {
    invoke(entered.getId());
}

Так что, если вы хотите, чтобы ваше состояние вызывалось непрерывно, вам просто нужно удалить защитные элементы перехода в описании конечного автомата (SCXML).

0 голосов
/ 28 ноября 2015

вы неправильно понимаете поведение конечного автомата. Суть состояния заключается в том, что иногда конечный автомат объекта удовлетворяет определенным условиям для выполнения определенных действий или ожидания какого-либо события. Конечно, вы можете описать определенный цикл в функции в классе секундомера, но имеет ли это какое-то значение? У запущенной функции есть поток таймера, а задачу таймера можно рассматривать как цикл, не так ли? состояние выполнения выполняет задачу потока и просто ожидает событие, чтобы выйти из этого состояния и остановить задачу.

0 голосов
/ 11 сентября 2009

Почему вы ожидаете такого поведения? Вашему государственному классу нужно только знать о переходе. После перехода вы находитесь в устойчивом состоянии.

...