热门标签 | 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



推荐阅读
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • 本题涉及一棵由N个节点组成的树(共有N-1条边),初始时所有节点均为白色。题目要求处理两种操作:一是改变某个节点的颜色(从白变黑或从黑变白);二是查询从根节点到指定节点路径上的第一个黑色节点,若无则输出-1。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • This document outlines the recommended naming conventions for HTML attributes in Fast Components, focusing on readability and consistency with existing standards. ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • Java 中 Writer flush()方法,示例 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
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社区 版权所有