c++ - 关于 Boost Statechart 中状态变化的通知

标签 c++ boost state-machine boost-statechart

是否有一种直接的方法可以在 Boost Statechart 中注册状态更改?

对于Digital Camera例如,假设我决定向应用程序添加一个 GUI。除了查询状态之外,是否有可能收到有关状态之间转换的通知?

if(0 != state_cast<const State1 *>())
{
    context<OuterCotext>().Notify(1);
}
else if(0 != state_cast<const State2 *>())
{
    context<OuterCotext>().Notify(2);
}

最佳答案

了解您已更改状态的最简单方法是进入前一个状态的析构函数,然后进入新状态的构造函数。

#include <boost/statechart/state_machine.hpp>
#include <boost/statechart/simple_state.hpp>
#include <iostream>

namespace sc = boost::statechart;

struct Greeting;
struct Machine : sc::state_machine< Machine, S1> {};

struct S1 : sc::simple_state<S1, Machine>
{
    S1() 
    { // entry
        std::cout << "Enter S1\n"; 
    } 
    ~S1() 
    { // exit
        std::cout << "Exit S1\n"; 
    } 
};

int main()
{
    Machine myMachine;
    myMachine.initiate();

    return 0;
}

Demo

boost.statechart中,onEntry/onExit Action 是由constructor/destructor<实现的 对,因为状态实例仅在状态是机器的当前状态时才有效。

因此,您可以在这些特殊函数中完成所有您想要记录、注册、登录状态更改(进入或退出)的操作。

关于c++ - 关于 Boost Statechart 中状态变化的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32509991/

相关文章:

c++ - 打开和关闭调试代码的方法

c++ - 位移位 - 用新数字替换位集的一部分

c++ - 单元测试C时如何重置状态机

python - 在 Transitions 中将具有多个状态的模型附加到多台机器

c# - 这是 FuSM(模糊状态机)的正确实现吗

c++ - 在cpp中对象初始化后设置数组的边界

c++ - 作为对象存储在内存中是什么意思?

c++ - 重新排列数组元素

c++ - boost::tokenizer_iterator 的问题——如何查看下一个迭代器?

c++ - 共享指针的双重检查锁定