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

【boost::statechart】3状态机

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

boost::statechart

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

 

实现代码如下:

 

1 #include
2 #include
3
4 #include // std::cout
5 #include // std::thread
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14 #include
15 #include
16
17 #include
18
19 using namespace std;
20 namespace sc = boost::statechart;
21
22 class EvStartStop : public sc::event
23 {
24 };
25 class EvReset : public sc::event
26 {
27 };
28
29 /*虚类,用于状态机获取状态*/
30 class IElapsedTime
31 {
32 public:
33 virtual double elapsedTime() cOnst= 0;
34 virtual ~IElapsedTime(){};
35 };
36
37 class Active;
38 /*秒表,状态机*/
39 class StopWatch : public sc::state_machine
40 {
41 public:
42 double elapsedTime() const
43 {
44 return state_cast().elapsedTime();
45 }
46 };
47
48 class Stopped;
49 /*活动状态*/
50 class Active : public IElapsedTime, public sc::state
51 {
52 public:
53 typedef sc::transition reactions;
54
55 Active(my_context ctx)
56 : my_base(ctx),
57 elapsed_time_(0)
58 {
59 cout <<"Entry Active" < 60 }
61 ~Active()
62 {
63 cout <<"Exit Active" < 64 }
65
66 double elapsedTime() const
67 {
68 return elapsed_time_;
69 }
70 double &elapsedTime()
71 {
72 return elapsed_time_;
73 }
74
75 private:
76 double elapsed_time_;
77 };
78
79 /*计时状态*/
80 class Running : public IElapsedTime, public sc::state
81 {
82 public:
83 typedef sc::transition reactions;
84 Running(my_context ctx)
85 : my_base(ctx),
86 start_time_(std::time(0))
87 {
88 cout <<"Entry Running" < 89 }
90 ~Running()
91 {
92 context().elapsedTime() = elapsedTime();
93 cout <<"Exit Running" < 94 }
95 virtual double elapsedTime() const
96 {
97 return context().elapsedTime() + std::difftime(std::time(0), start_time_);
98 }
99
100 private:
101 std::time_t start_time_;
102 };
103
104 /*停止状态*/
105 class Stopped : public IElapsedTime, public sc::state
106 {
107 public:
108 typedef sc::transition reactions;
109 Stopped(my_context ctx)
110 : my_base(ctx)
111 {
112 cout <<"Entry Stopped" <113 }
114 ~Stopped()
115 {
116 cout <<"Exit Stopped" <117 }
118 virtual double elapsedTime() const
119 {
120 return context().elapsedTime();
121 }
122 };
123
124 int main(int argc, char **argv)
125 {
126 StopWatch myWatch;
127 myWatch.initiate();
128 cout <<"---" <129
130 myWatch.process_event(EvStartStop());
131 for (int i = 0; i <10; i++)
132 {
133 boost::this_thread::sleep(boost::posix_time::seconds(1)); //休眠1秒
134 std::cout <<"time:" <135 }
136 myWatch.process_event(EvStartStop());
137 boost::this_thread::sleep(boost::posix_time::seconds(1));
138 std::cout <<"current time:" <139 cout <<"---" <140 myWatch.process_event(EvReset());
141 std::cout <<"reset time:" <142 cout <<"---" <143 return 0;
144 }

 



推荐阅读
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
author-avatar
hjalshj
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有