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



推荐阅读
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • 本题涉及一棵由N个节点组成的树(共有N-1条边),初始时所有节点均为白色。题目要求处理两种操作:一是改变某个节点的颜色(从白变黑或从黑变白);二是查询从根节点到指定节点路径上的第一个黑色节点,若无则输出-1。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 本文介绍如何在Java项目中使用Log4j库进行日志记录。我们将详细说明Log4j库的引入、配置及简单应用,帮助开发者快速上手。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
    本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis ... [详细]
  • 本文提供了一系列Python编程基础练习题,涵盖了列表操作、循环结构、字符串处理和元组特性等内容。通过这些练习题,读者可以巩固对Python语言的理解并提升编程技能。 ... [详细]
  • 本文探讨了将类成员属性设置为私有的重要性,并通过具体代码示例展示了如何实现对这些属性的有效控制。私有成员属性有助于增强数据的安全性和完整性,确保只有经过验证的数据才能被修改。 ... [详细]
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社区 版权所有