2

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包含答案,但它是非常技术性的(而是对实现比语义 - 教程也不是更清晰),并且包含大量参考,因此很难确定。

4

1 回答 1

4

你需要使用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

于 2017-01-03T09:12:25.143 回答