Boost状态图中的多个延迟事件

时间:2017-01-02 20:58:31

标签: c++ boost boost-statechart

多个延迟事件如何在Boost状态图中表现?

我们说我有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包含答案,但它非常技术性(相当于实现的描述而不是语义 - 教程也不清楚),并且包含很多引用,所以很难确定。

1 个答案:

答案 0 :(得分:3)

您需要使用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&#34; S1&#34; ,我们推迟处理事件&#34; E2&#34;和&#34; E3&#34;随后在STATE&#34; S2&#34;和&#34; S3&#34;

希望清楚......

注意:您需要添加头文件 #include <boost/statechart/deferral.hpp> 使用sc::deferral