Несколько отложенных событий в Boost Statechart

Как ведут себя несколько отложенных событий в Boost Statechart?

Допустим, у меня есть 4 состояния и 3 события. Неотложенные переходы выглядят следующим образом:

S1 — (E1) -> S2 — (E2) -> S3 — (E3) -> S4

Конечный автомат запускается в S1. Теперь события публикуются в следующем порядке: E2, E3, E1.

Я хочу, чтобы конечный автомат достиг S4 в результате этой последовательности событий. Что мне нужно сделать, чтобы этого добиться?

  • Я, очевидно, должен отложить E2 и E3 в S1.
  • Я наверное тоже должен отложить E3 в S2? Я думаю, в противном случае он будет отброшен при достижении S2.

Я предполагаю, что эта часть документации: http://www.boost.org/doc/libs/1_55_0/libs/statechart/doc/reference.html#process_event содержит ответ, но он очень технический (скорее описание реализации, чем семантики — учебник тоже не понятен), и содержит много ссылок, так что трудно точно знать.

2

Решение

Вам нужно использовать sc::deferral добиться того же. То, что вы хотите сделать, может быть достигнуто с помощью следующего кода.

// States
struct S1;
struct S2;
struct S3;
struct S4;// Events
struct E1 : sc::event<E1> {};
struct E2 : sc::event<E2> {};
struct E3 : sc::event<E3> {};

struct statemachine : sc::state_machine<statemachine, S1>{};

struct S1 : sc::simple_state<S1, statemachine> {
typedef mpl::list<
sc::transition< E1, S2 >,
sc::deferral< E2 >,
sc::deferral< E3 >
> reactions;

};

struct S2 : sc::simple_state<S2, statemachine> {
typedef sc::transition<E2, S3> reactions;
};

struct S3 : sc::simple_state<S3, statemachine> {
typedef sc::transition<E3,S4> reactions;
};

struct S4 : sc::simple_state<S4, statemachine> {
};

int main() {
statemachine sm;
sm.initiate();
// Event Sequence E2 -> E3 -> E1
sm.process_event(E2());
sm.process_event(E3());
sm.process_event(E1());
return 0;
}

В STATE «S1» мы отложили обработку событий «E2» и «E3», что впоследствии обрабатывается в STATE «S2» и «S3».

Надеюсь, это ясно ..

Примечание: вам нужно добавить заголовочный файл
#include <boost/statechart/deferral.hpp>
для использования sc::deferral

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector