【问题标题】:Multiple deferred events in Boost StatechartBoost Statechart 中的多个延迟事件
【发布时间】:2017-01-02 20:58:30
【问题描述】:

多个延迟事件在 Boost Statechart 中如何表现?

假设我有 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 包含答案,但它非常技术性(而不是对实现的描述而不是语义——本教程也不太清楚),并且包含大量参考资料,所以很难确定。

【问题讨论】:

    标签: c++ boost boost-statechart


    【解决方案1】:

    您需要使用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 &lt;boost/statechart/deferral.hpp&gt; 使用sc::deferral

    【讨论】:

    • 感谢您的精彩解释。所以我不需要在 S2 中再次推迟 E3,比如 struct S2 : sc::simple_state { typedef mpl::list, sc::deferral > 反应; }; ?
    • @Jens Muller :不,一旦延迟,事件将保留在外部队列中,每次发生新的状态转换时都会执行。他们将一直留在队列中,直到由任何后续事件处理程序处理
    • @DKG 假设事件的顺序是 E1、E3、E2。然后当我们收到 E3 事件时,我们处于 S2 中。是延期了吗?如果没有,E3 是否也可以在 S2 中延期?
    • 回答我自己的问题:如果 E3 可以到达 S2,则必须在 S2 中延迟 E3。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多