// 类似QTimer的定时器
class Timer
{
typedef void(* handler)();
public:
Timer()
: m_millseconds()
, m_timer(m_service, boost::posix_time::milliseconds())
, m_handler(NULL)
, m_tick()
{} /**
* @brief start 启动定时器
* @param time 定时间隔,毫秒为单位
*/
void start(int time = )
{
m_millseconds = time;
update(); boost::system::error_code error;
m_service.run(error);
} /**
* @brief stop 停止定时器
*/
void stop()
{
m_timer.cancel();
m_service.stop();
} /**
* @brief setHandle 设置句柄
* @param handle 定时器响应时,执行的句柄
*/
void setHandle(const handler handle)
{
m_handler = handle;
} /**
* @brief setTicker 设置定时次数
* @param tick 定时次数
*/
void setTicker(int tick)
{
m_tick = tick;
} private:
/**
* @brief time_handle 定时器响应函数
*/
void time_handle()
{
--m_tick;
if (m_tick <= )
{
stop();
return;
} if (m_handler != NULL)
{
m_handler();
} update();
} /**
* @brief update 更新定时器,实现重复响应效果
*/
void update()
{
using namespace boost::posix_time;
m_timer.expires_at(m_timer.expires_at() + milliseconds(m_millseconds));
m_timer.async_wait(boost::bind(&Timer::time_handle, this));
} private:
int m_millseconds;
boost::asio::io_service m_service;
boost::asio::deadline_timer m_timer;
handler m_handler;
int m_tick;
};

依赖的头文件:

 #include <boost/asio/deadline_timer.hpp>
#include <boost/system/system_error.hpp>
#include <boost/asio/io_service.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

依赖的boost库:

1. system

2. date_time

测试:

 void print()
{
cout << "hello timer" << endl;
} int main()
{
Timer t;
t.setHandle(&print);
t.start(); return ;
}

利用deadline_timer实现定时器Timer的更多相关文章

  1. JAVA多线程提高一:传统线程技术&传统定时器Timer

    前面我们已经对多线程的基础知识有了一定的了解,那么接下来我们将要对多线程进一步深入的学习:但在学习之前我们还是要对传统的技术进行一次回顾,本章我们回顾的则是:传统线程技术和传统的定时器实现. 一.传统 ...

  2. Java队列和定时器Timer

       一: Queue详解    Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构    Queue接口与List.Set同一级别,都是继承了Collection接口.Linked ...

  3. [并发编程 - 多线程:信号量、死锁与递归锁、时间Event、定时器Timer、线程队列、GIL锁]

    [并发编程 - 多线程:信号量.死锁与递归锁.时间Event.定时器Timer.线程队列.GIL锁] 信号量 信号量Semaphore:管理一个内置的计数器 每当调用acquire()时内置计数器-1 ...

  4. python中实现定时器Timer

    实现定时器最简单的办法是就是循环中间嵌time.sleep(seconds), 这里我就不赘述了 # encoding: UTF-8 import threading #Timer(定时器)是Thre ...

  5. 订餐系统之定时器Timer不定时

    经过几天漫长的问题分析.处理.测试.验证,定时器Timer终于定时了,于是开始了这篇文章,希望对还在纠结于“定时器Timer不定时”的同学有所帮助,现在的方案,在系统日志中会有警告,如果您有更好的方案 ...

  6. PHP框架Swoole的一个定时器Timer特性

    在各种业务型系统中,往往需要服务器在后台扫描相关数据,触发相应的统计.通知等操作. 比如对于一个项目管理系统,需要每天的特定时间内,统计每项任务的执行.到期情况.整个项目的进度等等,根据统计情况,做相 ...

  7. C#创建windows服务搭配定时器Timer使用实例(用代码做,截图版)

       功能说明:C#创建一个windows服务,服务启动时D:\mcWindowsService.txt写入数据,服务运行期间每隔两秒写入当前时间. 原理这些就不说了,三语两语说不清楚,直接贴一个实例 ...

  8. iOS 定时器Timer常见问题

    最近有朋友问我使用NStimer遇见与ScrollView并存时存在主线程阻塞的问题,自己总结几种解决方法: 问题原因: 一般定时器timer都会被以默认模式default添加到主线程的runloop ...

  9. 定时器Timer不定时

    订餐系统之定时器Timer不定时 经过几天漫长的问题分析.处理.测试.验证,定时器Timer终于定时了,于是开始了这篇文章,希望对还在纠结于“定时器Timer不定时”的同学有所帮助,现在的方案,在系统 ...

随机推荐

  1. linux上的常用命令

    删除目录及文件 (删除tem目录和所有.xml文件) rm -rf tem/ *.xml 复制文件 cp zoo_sample.cfg zoo.cfg 两台机的目录相互拷贝 scp -r apps/ ...

  2. Windows 入门杂乱无章版

    windows入门 /users/username/appdata/roaming/microsoft/windows/start menu/startup目录中的应用程序是在该用户登录时启动的 /w ...

  3. HDU 3829——Cat VS Dog——————【最大独立集】

    Cat VS Dog Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit S ...

  4. .NET面试题5

    常见面试题目: 1. const和readonly有什么区别? 2. 哪些类型可以定义为常量?常量const有什么风险? 3. 字段与属性有什么异同? 4. 静态成员和非静态成员的区别? 5. 自动属 ...

  5. Jquery 客户端验证

    Jquery 客户端验证 //引入js文件 validate.js <html> <head> <title>jqueryValidateDemo</titl ...

  6. 在UITableView中识别左右滑动,实现上下翻页的功能

    目前有三种方案: 1. UIScrollView + UITableView. 实现方法,在UIScrollView中,加入UITableView即可 设置UIScrollView的代理和方法 - ( ...

  7. 赶集网mysql开发36条军规

    写在前面的话: 总是在灾难发生后,才想起容灾的重要性: 总是在吃过亏后,才记得曾经有人提醒过. (一)核心军规 (1)不在数据库做运算    cpu计算务必移至业务层: (2)控制单表数据量    i ...

  8. js获取文件上传进度

    js获取文件上传进度: <input name="file" id="FileUpload" type="file" /> &l ...

  9. HTML标签_2

  10. JavaScript库 — — React

    React不支持IE6.IE7 React是什么?用于构建用户界面的JAVASCRIPT库,是MVC中的V(视图). React特点:1. 声明式设计2. 减少与DOM的交互,高效3. JSX - J ...