Boost Statechart 中的多个延迟事件
Multiple deferred events in Boost Statechart
多个延迟事件在 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 包含答案,但它非常技术化(与其说是语义的描述,不如说是对实现的描述——教程也不是很清楚),并且包含很多参考资料,所以很难确定。
您需要使用 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"[=14= 中处理]
希望它清楚..
注意:需要添加头文件
#include <boost/statechart/deferral.hpp>
使用 sc::deferral
多个延迟事件在 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 包含答案,但它非常技术化(与其说是语义的描述,不如说是对实现的描述——教程也不是很清楚),并且包含很多参考资料,所以很难确定。
您需要使用 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"[=14= 中处理]
希望它清楚..
注意:需要添加头文件
#include <boost/statechart/deferral.hpp>
使用 sc::deferral