Boost学习1--计时器的实现

Boost是个很强大的C++库,这个系列记录了使用Boost自定义的一系列小工具。

Timer是个很常用的工具,主要功能是每隔一段时间,触发某个事件。在很多其他的开源库中都有类似的小组件,比如QT中的qtimer。TImer中比较核心的地方在于如何触发事件,所谓触发事件,可以认为是唤起某个函数来执行。另外,在Timer运行的过程中,程序的其他线程仍然在工作。所以这会是个多线程运行的工具。


先上代码:

class  MyTimer
{
public:
	MyTimer(){}
	~MyTimer(){
		m_.try_lock();
		m_.unlock();
	}
	void bind_signal(boost::function<void()> f){
		f_ = f;
	}
	void start(double ms){
		m_.try_lock();
		m_.unlock();
		boost::function<void()> func = boost::bind(&MyTimer::sleep_while, this, ms);
		t_.reset(new boost::thread(func));
	}
	void stop(){
		while (!m_.try_lock());
	}
private:
	void sleep_while(double t){
		while (m_.try_lock()){
			m_.unlock();
#if _WIN32//_MSC_VER
			Sleep(t);
#else
			sleep(t / 1000.0);
#endif
			f_();
		}
	}
private:
	boost::function<void()> f_;
	boost::mutex m_;
	boost::shared_ptr<boost::thread> t_;
};


现在来逐行分析上述代码:

	void bind_signal(boost::function<void()> f){
		f_ = f;
	}

要触发事件,首先要告诉timer,需要执行什么样的事件(即函数),利用boost::function可以很方便的绑定需要处理的函数,甚至可以动态绑定类的成员函数。


Timer当然需要提供start和stop方法。在此,使用thread和mutex来实现,简单来说,用互斥量来控制sleep_while。

void start(double ms){
		m_.try_lock();
		m_.unlock();
		boost::function<void()> func = boost::bind(&MyTimer::sleep_while, this, ms);
		t_.reset(new boost::thread(func));
	}
	void stop(){
		while (!m_.try_lock());
	}
private:
	void sleep_while(double t){
		while (m_.try_lock()){
			m_.unlock();
#if _WIN32//_MSC_VER
			Sleep(t);
#else
			sleep(t / 1000.0);
#endif
			f_();
		}
	}

 


这样,我们就得到了一个自制的timer啦。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值