C++ Boost状态图中的多个延迟事件
多个延迟事件在Boost状态图中的行为如何 假设我有4个状态和3个事件。非延迟转换如下所示: S1--(E1)-->S2--(E2)-->S3--(E3)-->S4 状态机在S1中启动。现在事件按以下顺序发布:E2、E3、E1 我希望状态机作为这一系列事件的结果达到S4。为了实现这一目标,我必须做些什么C++ Boost状态图中的多个延迟事件,c++,boost,boost-statechart,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时,它将被丢弃 我假设文档的这一部分:包含答案,但它是非常技术性的(与其说是对实现的描述,不如说是对语义的
- 我显然不得不推迟S1中的E2和E3
- 我可能也不得不推迟S2中的E3?否则,当达到S2时,它将被丢弃
我假设文档的这一部分:包含答案,但它是非常技术性的(与其说是对实现的描述,不如说是对语义的描述——教程也不清楚),并且包含大量的参考文献,因此很难确定。您需要使用
sc::delay
来实现同样的目标。您想做的事情可以通过以下代码实现
// 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;
}
//状态
结构S1;
结构S2;
结构S3;
结构S4;
//事件
结构E1:sc::事件{};
结构E2:sc::event{};
结构E3:sc::事件{};
结构状态机:sc::state_machine{};
结构S1:sc::简单_状态{
typedefmpl::list<
sc::转变,
sc::延迟,
sc::延期
>反应;
};
结构S2:sc::简单_状态{
过渡反应;
};
结构S3:sc::简单_状态{
过渡反应;
};
结构S4:sc::简单_状态{
};
int main(){
国家机器主义;
sm.initiate();
//事件序列E2->E3->E1
sm.process_事件(E2());
sm.process_事件(E3());
sm.process_事件(E1());
返回0;
}
在状态“S1”中,我们延迟了事件“E2”和“E3”的处理,这些事件随后在状态“S2”和“S3”中处理
希望天气晴朗
注意:您需要添加一个头文件
#包括
对于使用sc::延迟感谢您的解释。所以我不需要在S2中再次延迟E3,比如结构S2:sc::simple_state{typedef mpl::list