热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BoostStateChart实现状态机秒表例程

Boost提供了状态机的实现接口,采用了CRTP技术实现,下面以秒表为例子实现一个状态机,这是一个官方的例子,也可以参考资料

 

Boost 提供了状态机的实现接口,采用了CRTP技术实现,下面以秒表为例子实现一个状态机,这是一个官方的例子,也可以参考资料:Boost Statechart 庫,状态机的状态转换图如下所示:

实现代码如下: 

#include
#include
#include // std::cout
#include // std::thread
#include <string>
#include

#include

#include

#include

#include
event.hpp>
#include

#include

#include

#include
#include using namespace std;
namespace sc &#61; boost::statechart;class EvStartStop : public sc::event
{
};
class EvReset : public sc::event
{
};
/*虚类&#xff0c;用于状态机获取状态*/
class IElapsedTime
{
public:virtual double elapsedTime() const &#61; 0;virtual ~IElapsedTime(){};
};
class Active;
/*秒表&#xff0c;状态机*/
class StopWatch : public sc::state_machine
{
public:double elapsedTime() const{return state_cast<const IElapsedTime &>().elapsedTime();}
};
class Stopped;
/*活动状态*/
class Active : public IElapsedTime, public sc::state
{
public:typedef sc::transition reactions;Active(my_context ctx): my_base(ctx),elapsed_time_(0){cout <<"Entry Active" << endl;}~Active(){cout <<"Exit Active" << endl;}double elapsedTime() const{return elapsed_time_;}double& elapsedTime(){return elapsed_time_;}private:double elapsed_time_;
};
/*计时状态*/
class Running : public IElapsedTime, public sc::state
{
public:typedef sc::transition reactions;Running(my_context ctx): my_base(ctx),start_time_(std::time(0)){cout <<"Entry Running" << endl;}~Running(){context().elapsedTime() &#61; elapsedTime();cout <<"Exit Running" << endl;}virtual double elapsedTime() const{return context().elapsedTime()&#43; std::difftime(std::time(0), start_time_);}private:std::time_t start_time_;
};
/*停止状态*/
class Stopped : public IElapsedTime, public sc::state
{
public:typedef sc::transition reactions;Stopped(my_context ctx): my_base(ctx){cout <<"Entry Stopped" << endl;}~Stopped(){cout <<"Exit Stopped" << endl;}virtual double elapsedTime() const{return context().elapsedTime();}};int main(int argc, char** argv)
{StopWatch myWatch;myWatch.initiate();cout
<<"---" << endl;myWatch.process_event(EvStartStop());for(int i &#61; 0; i <10; i&#43;&#43;){boost::this_thread::sleep(boost::posix_time::seconds(1)); //休眠1秒std::cout <<"time:" <"\n";}myWatch.process_event(EvStartStop());boost::this_thread::sleep(boost::posix_time::seconds(1));std::cout <<"current time:" <"\n";cout <<"---" << endl;myWatch.process_event(EvReset());std::cout <<"reset time:" <"\n";cout <<"---" << endl;return 0;
}

 运行效果如下&#xff1a;

Entry Active
Entry Stopped
---
Exit Stopped
Entry Running
time:
1
time:
2
time:
3
time:
4
time:
5
time:
6
time:
7
time:
8
time:
9
time:
10
Exit Running
Entry Stopped
current time:
10
---
Exit Stopped
Exit Active
Entry Active
Entry Stopped
reset time:
0
---
Exit Stopped
Exit Active

 

转:https://www.cnblogs.com/cv-pr/p/7598342.html



推荐阅读
  • 深入解析C++ Atomic编程中的内存顺序
    在多线程环境中,为了防止多个线程同时修改同一数据导致的竞争条件,通常会使用内核级同步对象,如事件、互斥锁和信号量等。然而,这些方法往往伴随着高昂的上下文切换成本。本文将探讨如何利用C++11中的原子操作和内存顺序来优化多线程编程,减少不必要的开销。 ... [详细]
  • 深入解析mt_allocator内存分配器(二):多线程与单线程场景下的实现
    本文详细介绍了mt_allocator内存分配器在多线程和单线程环境下的实现机制。该分配器以2的幂次方字节为单位分配内存,支持灵活的配置和高效的性能。文章分为内存池特性描述、内存池实现、单线程内存池实现、内存池策略类实现及多线程内存池实现等部分,深入探讨了内存池的初始化、内存分配与回收的具体实现。 ... [详细]
  • ED Tree HDU4812 点分治+逆元
    这道题非常巧妙!!!我们进行点分治的时候,算出当前子节点的所有子树中的节点,到当前节点节点的儿子节点的距离,如下图意思就是当前节点的红色节点,我们要求出红色节点的儿子节点绿色节点, ... [详细]
  • 前端技术分享——利用Canvas绘制鼠标轨迹
    作为一名前端开发者,我已经积累了Vue、React、正则表达式、算法以及小程序等方面的技能,但Canvas一直是我的盲区。因此,我在2018年为自己设定了一个新的学习目标:掌握Canvas,特别是如何使用它来创建CSS3难以实现的动态效果。 ... [详细]
  • 2022年4月15日的算法练习题,包括最长公共子序列和线段树的应用。 ... [详细]
  • 本文详细介绍了Oracle RMAN中的增量备份机制,重点解析了差异增量和累积增量备份的概念及其在不同Oracle版本中的实现。通过对比两种备份方式的特点,帮助读者选择合适的备份策略。 ... [详细]
  • 本文深入探讨了领域驱动设计(DDD)中的聚合概念及其在事件溯源架构中的应用。聚合是一组紧密相关的类,这些类作为一个整体运作,形成一个有明确边界的组织。只有通过聚合根才能与聚合内的对象进行交互。 ... [详细]
  • 来自FallDream的博客,未经允许,请勿转载,谢谢。一天一套noi简直了.昨天勉强做完了noi2011今天教练又丢出来一套noi ... [详细]
  • Lua字符串1.字符串常见形式字符串或串(String)是由数字、字母、下划线组成的一串字符。Lua语言中字符串可以使用以下三种方式来表示:•单引号间的一串字符。 ... [详细]
  • 本文介绍了如何使用Java编程语言实现凯撒密码的加密与解密功能。凯撒密码是一种替换式密码,通过将字母表中的每个字母向前或向后移动固定数量的位置来实现加密。 ... [详细]
  • 本文探讨了Java中有效停止线程的多种方法,包括使用标志位、中断机制及处理阻塞I/O操作等,旨在帮助开发者避免使用已废弃的危险方法,确保线程安全和程序稳定性。 ... [详细]
  • 本题要求计算从起点到终点所有最短路径的总权重,使用SPFA算法进行求解。 ... [详细]
  • 本文介绍了两个重要的Node.js库——cache-content-type和mime-types,它们在处理HTTP响应头时非常有用。cache-content-type是基于mime-types构建的,并且实现了缓存机制以提高性能。 ... [详细]
  • 本文介绍了一个将 Java 实体对象转换为 Map 的工具类,通过反射机制获取实体类的字段并将其值映射到 Map 中,适用于需要将对象数据结构化处理的场景。 ... [详细]
  • SpringBoot底层注解用法及原理
    2.1、组件添加1、Configuration基本使用Full模式与Lite模式示例最佳实战配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断配置类组 ... [详细]
author-avatar
phpxiaoxuesheng
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有