2017-01-02 7 views
1

Как ведут себя несколько событий с отсрочкой в ​​Boch Statechart?Множественные отложенные события в файле состояния Boost

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

S1 - (E1) -> S2 - (E2) -> S3 - (Е3) -> 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; 
} 

В ГОСУДАРСТВЕННОМ "S1", мы отложенная обработка событий "E2" и "E3", который затем обрабатывается в ГОСУДАРСТВЕ "S2" и "S3"

Надежда его ясно ..

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

+0

Спасибо за хорошее объяснение. Так что не нужно снова отложить E3 в S2, как STRUCT S2: СБН :: simple_state { ЬурейеЕ MPL :: Список < СБН :: переходную , подкожно :: отсрочек < E3 > > реакции; }; ? –

+1

@Jens Muller: Нет, однажды отложенное событие остается во внешней очереди, которое будет выполняться каждый раз, когда произойдет новый переход состояния. Они останутся в очереди до тех пор, пока не обработаются каким-либо одним из последующих обработчиков событий. –

+0

@DKG Предположим, что порядок событий - E1, E3, E2. Тогда мы находимся в S2, когда получаем событие E3. Отложено ли это? Если нет, можно ли E3 также отложить в S2? –