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



推荐阅读
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • 在HDU 1166敌军布阵问题中,通过运用线段树数据结构,可以高效地计算指定区间的敌军数量。该算法不仅能够在限定的时间和内存条件下快速求解,还能够灵活应对动态变化的战场局势,为实时决策提供支持。 ... [详细]
  • 掌握PHP编程必备知识与技巧——全面教程在当今的PHP开发中,了解并运用最新的技术和最佳实践至关重要。本教程将详细介绍PHP编程的核心知识与实用技巧。首先,确保你正在使用PHP 5.3或更高版本,最好是最新版本,以充分利用其性能优化和新特性。此外,我们还将探讨代码结构、安全性和性能优化等方面的内容,帮助你成为一名更高效的PHP开发者。 ... [详细]
  • 题目链接:POJ 2777。问题描述:给定一个区域,需要进行多次涂色操作,并在每次操作后查询某个区间内的不同颜色数量。解决方案:由于题目中颜色种类不超过30种,可以利用线段树的懒惰更新策略来高效处理这些操作。通过懒惰标记,避免了不必要的节点更新,从而显著提高了算法的效率。此外,该方法还能有效应对大规模数据输入,确保在合理的时间内完成所有操作。 ... [详细]
  • 在TypeScript中,我定义了一个名为 `Employee` 的接口,其中包含 `id` 和 `name` 属性。为了使这些属性可选为空,可以通过使用 `| null` 或 `| undefined` 来扩展其类型定义。例如,`id: number | null` 表示 `id` 可以是数字或空值。这种类型的灵活性在处理不确定的数据时非常有用,可以提高代码的健壮性和可维护性。 ... [详细]
  • 本文详细介绍了 jQuery 的入门知识与实战应用,首先讲解了如何引入 jQuery 库及入口函数的使用方法,为初学者提供了清晰的操作指南。此外,还深入探讨了 jQuery 在实际项目中的多种应用场景,包括 DOM 操作、事件处理和 AJAX 请求等,帮助读者全面掌握 jQuery 的核心功能与技巧。 ... [详细]
  • 基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析
    基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析 ... [详细]
  • 探索聚类分析中的K-Means与DBSCAN算法及其应用
    聚类分析是一种用于解决样本或特征分类问题的统计分析方法,也是数据挖掘领域的重要算法之一。本文主要探讨了K-Means和DBSCAN两种聚类算法的原理及其应用场景。K-Means算法通过迭代优化簇中心来实现数据点的划分,适用于球形分布的数据集;而DBSCAN算法则基于密度进行聚类,能够有效识别任意形状的簇,并且对噪声数据具有较好的鲁棒性。通过对这两种算法的对比分析,本文旨在为实际应用中选择合适的聚类方法提供参考。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • 本文介绍了如何通过HTML样式为网页标签添加各种视觉效果。通过使用CSS类和内联样式,开发者可以轻松地控制文本颜色、背景色、边框、字体大小等属性,从而提升网页的美观性和用户体验。示例代码展示了如何在HTML标签中应用这些样式,以便开发者能够快速上手并应用于实际项目中。 ... [详细]
  • 初探设计模式之代理模式:原理与应用解析
    在设计模式中,代理模式通过一个代理对象来控制对真实对象的访问。UML图展示了代理类(如MathProxy)维护了一个引用,使得代理能够访问实际的主题对象。代理模式不仅能够延迟初始化昂贵的对象,还能在访问前后添加额外的操作,如权限检查或日志记录。这种模式在远程服务调用、虚拟代理和智能引用等方面有广泛应用。 ... [详细]
  • 本文详细探讨了OpenCV中人脸检测算法的实现原理与代码结构。通过分析核心函数和关键步骤,揭示了OpenCV如何高效地进行人脸检测。文章不仅提供了代码示例,还深入解释了算法背后的数学模型和优化技巧,为开发者提供了全面的理解和实用的参考。 ... [详细]
  • Understanding the Distinction Between decodeURIComponent and Its Encoding Counterpart
    本文探讨了 JavaScript 中 `decodeURIComponent` 和其编码对应函数之间的区别。通过详细分析这两个函数的功能和应用场景,帮助开发者更好地理解和使用它们,避免常见的编码和解码错误。 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
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社区 版权所有