2017-01-02 5 views
1

複数の遅延イベントはどのようにブーストステートチャートで動作しますか?ブーストステートチャートの複数の遅延イベント

私は4つの州と3つのイベントがあるとしましょう。非遅延遷移次のように見える:

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

状態機械はで開始S1。イベントは、E2、E3、E1の順に転記されます。

ステートマシンがこの一連のイベントの結果としてS4に到達するようにします。これを達成するために私は何をしなければなりませんか?

  • 明らかに、S1でE2とE3を延期する必要があります。
  • S2でE3を延期する必要がありますか?私はそれ以外の場合は、S2に達すると破棄されると思います。

私は、ドキュメントのこの部分を想定していますhttp://www.boost.org/doc/libs/1_55_0/libs/statechart/doc/reference.html#process_eventは答えが含まれていますが、それは非常に技術的である(意味論のより実装のではなく説明 - チュートリアルでは、どちらか明確ではない)、および参照の多くが含まれています、確かに知るのは難しいです。

答えて

2

これを達成するには、sc::deferralを使用する必要があります。あなたがしたいことは、次のコードによって達成することができます。 STATE "S1" では

// 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; 
} 

、私たちは "E2"、その後STATE "S2" で扱われている "E3" および "S3"

は、その明確なホープ..

イベントのハンドリングを延期

注:あなたは良い説明のためsc::deferral

+0

感謝を使用するためのヘッダファイル #include <boost/statechart/deferral.hpp> を追加する必要があります。 だから私は 構造体S2と同様に、S2で再びE3を延期する必要はありません:SC :: simple_state { のtypedef MPL ::リスト< SC ::推移、 SC ::延期反応; }; ? –

+1

@Jens Muller:いいえ、いったん延期されると、イベントは外部キューに残り、新しい状態遷移が発生するたびに実行されます。後続のイベントハンドラのいずれかで処理されるまで待ち行列に残ります –

+0

@DKGイベントの順序をE1、E3、E2とします。それから、E3イベントを受け取ったらS2に入ります。それは延期ですか?そうでない場合は、E3もS2で延期できますか? –

関連する問題