boost学习之01 - 有限状态机

基于 boost::statechart 模板库的一个秒表计时器

 

源代码如下:

#include <iostream>
#include <iomanip>
#include <ctime>
#include <boost/statechart/state_machine.hpp>
#include <boost/statechart/simple_state.hpp>
#include <boost/statechart/transition.hpp>

using namespace std;
namespace sc = boost::statechart;

namespace boost_learning
{
	namespace fsm
	{
		class IElapsedTime
		{
		public:
			virtual double ElapsedTime() const  = 0;
		};

		class EvStartStop : public sc::event<EvStartStop> {};
		class EvReset : public sc::event<EvReset> {};

		class Active;

		// 状态机定义
		class StopWatch : public sc::state_machine<StopWatch
			, Active>	// 初始状态
		{
		public:
			double ElapsedTime() const   
			{  
				return  state_cast<const IElapsedTime &>().ElapsedTime();
			}  
		};

		class Stopped;	// 作为Active根状态下的初始子状态,需提前声明

		// 根Active状态定义
		class Active : public sc::simple_state<Active
			, StopWatch		// 作为状态机StopWatch的所属状态
			, Stopped>		// 初始子状态
		{
		public:
			typedef sc::transition< EvReset, Active > reactions;

			Active() : elapsedTime_(0.0)
			{
			}

			double ElapsedTime() const {return elapsedTime_;}
			double & ElapsedTime() {return elapsedTime_;}

		private :
			double  elapsedTime_ ;

		};

		// Running状态定义
		class Running : public IElapsedTime, public sc::simple_state<Running
			, Active>	// 父状态
		{
		public:
			typedef sc::transition< EvStartStop, Stopped > reactions;

			Running() : startTime_(std::time(0))
			{
			}

			~Running()
			{
				context<Active>().ElapsedTime() +=
					std::difftime(std::time( 0 ), startTime_);
			}

			virtual double ElapsedTime() const   
			{  
				return context<Active>().ElapsedTime() +  
					std::difftime(std::time( 0 ), startTime_);  
			}  

		private :
			std:: time_t  startTime_;
		};

		// Stopped状态定义
		class Stopped : public IElapsedTime, public sc::simple_state<Stopped
			, Active>	// 父状态
		{
		public:
			typedef sc::transition< EvStartStop, Running > reactions;

			virtual double ElapsedTime() const   
			{  
				return context<Active>().ElapsedTime();  
			}   
		};
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	using namespace boost_learning::fsm;

	StopWatch myWatch;
	myWatch.initiate();

	std::cout << "初始化: " << myWatch.ElapsedTime() <<  ", 按Enter键开始计时!" << endl;
	cin.get();

	do
	{
		std::cout << "本次计时从 " << myWatch.ElapsedTime() << " 开始,按Enter键停止... " << endl;

		myWatch.process_event(EvStartStop());
		cin.get();
		myWatch.process_event(EvStartStop());

		std::cout << "计时停止: 共计 " << myWatch.ElapsedTime() <<  " 秒, 按Enter键继续,Q键退出!" << endl;
	} while(cin.get() != 'q');


	myWatch.process_event(EvReset());

	std::cout << "==== 计时器已被重置,按Enter键退出 ====" << endl;
	cin.get();
	cin.get();

	return 0;
}

 

示例结果输出:

初始化: 0, 按Enter键开始计时!

本次计时从 0 开始,按Enter键停止...

计时停止: 共计 5 秒, 按Enter键继续,Q键退出!

本次计时从 5 开始,按Enter键停止...

计时停止: 共计 8 秒, 按Enter键继续,Q键退出!

本次计时从 8 开始,按Enter键停止...

计时停止: 共计 16 秒, 按Enter键继续,Q键退出!
q
==== 计时器已被重置,按Enter键退出 ====

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值