Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost状态图中的多个延迟事件_C++_Boost_Boost Statechart - Fatal编程技术网

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

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时,它将被丢弃 我假设文档的这一部分:包含答案,但它是非常技术性的(与其说是对实现的描述,不如说是对语义的

多个延迟事件在Boost状态图中的行为如何

假设我有4个状态和3个事件。非延迟转换如下所示:

S1--(E1)-->S2--(E2)-->S3--(E3)-->S4

状态机在S1中启动。现在事件按以下顺序发布:E2、E3、E1

我希望状态机作为这一系列事件的结果达到S4。为了实现这一目标,我必须做些什么

  • 我显然不得不推迟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>reactions;}@Jens Muller:不,一旦延迟,事件将保留在外部队列中,每次发生新的状态转换时都将执行该队列。它们将保持在队列中,直到它被后续事件中的任何一个处理handlers@DKG假设事件的顺序是E1、E3、E2。当我们收到E3事件时,我们处于S2。延期了吗?如果没有,E3也可以在S2中延迟吗?回答我自己的问题:如果E3可以到达S2,那么S2中E3的延迟是必要的。