OpenU.Ru
Выполнить переход.
См. run to completion; trigger.
Семантика
При осуществлении необходимого для перехода события,
и при условии удовлетворения сторожевого условия
выполняется переход, который приводит к изменению активного состояния. Если
на момент получения события, конечный автомат выполняет непрерывный шаг, то
это событие сохраняется и обрабатывается сразу после завершения этого шага.
Переход запускается, если событие обрабатывается во время, когда объект находится
в состоянии, содержащем этот переход, или в одном из его вложенных состояний.
Событие запускает переход, если оно является потомком того события, которое
указано у перехода. Если у комплексного перехода есть несколько исходных состояний,
то для разрешения перехода активными должны быть вес эти состояния. Переход
по завершении становится возможен в тот момент, когда заканчивается деятельность,
а его исходном состоянии. Если исходное состояние
- композитное, то переход по завершении осуществляется
тогда, когда все непосредственные подсостояния завершили свою деятельность или
достигли конечных состояний.
При обработке события происходит оценка сторожевого условия (если таковое имеется).
Если логическое выражение в сторожевом
условии истинно, то переход запускается фактически. При этом выполняется действие
при переходе, и состояние объекта меняется на целевое состояние перехода (в
случае внутреннего перехода состояние
не изменяется). Во время изменения состояния выполняются действия при выходе
из старого состояния и при входе в новое, целевое состояние перехода. Обратите
внимание на то, что старое состояние может представлять собой вложенное подсостояние
исходного состояния перехода.
Если сторожевое условие перехода не удовлетворено, то ничего не происходит.
(Впрочем, может запуститься какой-либо другой переход, чье сторожевое условие
будет удовлетворено.)
Если на данный момент возможно несколько переходов, запустится фактически только
один из них. При этом переход во вложенном состоянии имеет преимущество перед
переходом во внешнем состоянии - других правил выбора перехода нет. Такая ситуация
довольно часто встречается в реальном мире.
На практике, при реализации можно задавать порядок запуска переходов. Это не
заденет семантику, поскольку порядок запуска переходов можно задать и при помощи
сторожевых условий. Однако зачастую проще будет сказать: "Этот переход
запускается в том случае, если не запускается никакой другой переход".
Отложенные события. Если событие (или его предок) помечено как отложенное в
каком-либо состоянии (или во внешнем, по отношению к нему, состоянии), то это
событие не запускает переход, а остается отложенным до тех пор, пока объект
не войдет в состояние, и котором событие уже не будет отложенным. Когда объект
входит, в новое состояние, все ранее отложенные события подаются к рассмотрению
и совершаются в любой последовательности. Если первое по порядку событие не
запускает переход, оно игнорируется и обрабатывается следующее на очереди событие.
Если событие, отложенное в прошлом состоянии, отложено и в новом, то оно может
запускать переход. Однако, если это событие не запускает переход, оно не игнорируется,
а сохраняется как отложенное до следующего состояния. Если же какое-либо событие
запустило переход в новое состояние, то все прочие, оставшиеся в очереди события,
переоцениваются заново, после чего процедура обработки отложенных событии повторяется.
Реализация в программном коде может иметь свои, более строгие правила относительно
порядка выполнения отложенных событий. Кроме того, она может предоставлять операции
для изменения и управления этим порядком.