• boost状态机学习二(秒表)


    1 基础主题:秒表
        下面我们要为一个机械秒表建模一个状态机。这样一个秒表通常会有两个按钮。
         * Start/Stop
         * Reset
         同时有两种状态:
         * Stoped: 表针停留在上次停止时的位置:
            o 按下Reset按钮,表针回退到0的位置。秒表保持在Stoped状态不变。
            o 按下Start/Stop按钮,秒表转到Running状态。
         * Running: 表针在移动,并持续显示过去的时间:
            o 按下Reset按钮,表针回退到0的位置,秒表转到停止状态。
            o 按下Start/Stop按钮,转到Stoped状态。
        下面是其UML图:
    
    
    
    1.1 定义状态和事件
    两个按钮可以建模为两个事件。进而,定义出必要的状态和初始状态。我们从下面的代码开始,以前的代码片段会陆续加入其中:
    
    #include <boost/statechart/event.hpp> 
    #include <boost/statechart/state_machine.hpp> 
    #include <boost/statechart/simple_state.hpp> 
     
    namespace sc = boost::statechart; 
     
    struct EvStartStop : sc::event< EvStartStop > {}; 
    struct EvReset : sc::event< EvReset > {}; 
     
    struct Active; 
    struct StopWatch : sc::state_machine< StopWatch, Active > {}; 
     
    struct Stopped; 
     
    // 这里的simple_state类模板可以接受4个参数:
    // - 第3个参数指定内部的初始状态,如果有一个这样的状态的话。
    //   在这里,Active有一个内部状态(Stoped), 所以将这个内部
    //   初始状态传给它的基类。
    // - 第4个参数指定是否保留和保留什么类型历史
     
    // Active是最外层的状态,因此要把它所属的状态机类传给它
    struct Active : sc::simple_state< 
      Active, StopWatch, Stopped > {}; 
     
    // Stopped 和 Running 都把Active作为它们的上下文,这使他们嵌入到了Active状态中。struct Running : sc::simple_state< Running, Active > {}; 
    struct Stopped : sc::simple_state< Stopped, Active > {}; 
     
    // 因为状态的上下文必须是一个完整的类型(不能单单是声明),
    // 所以状态机必须要在“外层状态”之间先定义。
    // 也就是说,我们需要从状态机开始,然后是最外层的状态,然后是其内部的状态,如此反复。
    // 我们可以用广度或深度方式,再或是以两都混合的方式来进行定义。
     
    int main() 
    { 
      StopWatch myWatch; 
      myWatch.initiate(); 
      return 0; 
    }
    这个代码已经可以编译了,但不会发生任何可察觉的事件。
  • 相关阅读:
    一句话命令修改大小写
    SpringBoot打成jar包后无法读取resources资源文件里文件路径的问题 cannot be resolved to absolute file path because it does
    java路径两种写法"/"和"\"
    java SASL_SSL 帐号密码 方式访问 kafka
    Mybatis 获得自动生成主键值
    swo2 SOA OAuth 使用,
    java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp是因为时间字段里有'0000-00-00 00:00:00‘这种格式的日期导致的
    OkHttp3找不到FormEncodingBuilder
    Maven依赖的版本范围
    java lambda求和
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/3578940.html
Copyright © 2020-2023  润新知