利用boost.deadline_timer() 可以很方便的实现定时器功能,详情参考:http://www.boost.org/doc/libs/1_57_0/doc/html/boost_asio/reference/deadline_timer.html
比如等待指定的时间数:
boost::asio::io_service ioservice;
boost::asio::deadline_timer tm(ioservice, boost::posix_time::seconds(5));
//这里指定的是绝对时间,若指定相对时间可用time_duration指定时间段
time.wait();
这里也可以用deadline_timer的两个成员函数来指定需等待的时间,deadline_timer.expires_at(指定绝对时间),deadline_timer.expires_from_now(指定相对时间),在等待的时候可选择同步或者异步,time.wait()或者time.async_wait(handler),操作起来比较方便,而且还是跨平台的。
但是在这里有一个问题,比如我在做一个定时升级的工具时,我想指定升级工具的升级时间,比如是2015.4.12 00:00,按照官网上的做法是,(这里指定的是绝对时间)
boost::asio::io_service ioservice;
//两种不同的时间格式
boost::asio::deadline_timer tm(ioservice, boost::posix_time::time_from_string("2015-04-12 23:01:50");
//boost::asio::deadline_timer tm(ioservice, boost::posix_time::from_iso_string("20150412T230150"));
//以T为分隔符
time.wait();
这么做了后,你会发现程序根本没有等待到你指定的时间才开始相应的任务,而是提前很长一段时间,当时弄了很久尝试了很多方法还是百思不得其解,后来仔细的看了下文档后才发现原来boost中的时间是UTC时间,在程序中应该换成本地时间,所以得换算下时区才行或者用boost中提供的local_time,
【Boost.deadline_timer实现定时器功能时需注意的时区问题】
boost::asio::io_service ioservice;
boost::posix_time::ptime tm(boost::posix_time::time_from_string("2015-04-12 23:01:50"));
tm -= boost::posix_time::time_duration(8, 0, 0);
//北京时间转换为UTC时间, 相差8个小时
boost::asio::deadline_timer timer(ioservice, tm);
timer.wait();
推荐阅读
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- C/C++|C/C++ basis 02
- Qt实战|Qt+OpenCV联合开发(二十一)--图像翻转与旋转
- Qt实战|Qt+OpenCV联合开发(十四)--图像感兴趣区域(ROI)的提取
- Qt实战|Qt+OpenCV联合开发(十三)--通道分离与合并
- opencv|Qt+OpenCV联合开发(十六)--图像几何形状绘制
- Qt实战|Qt+OpenCV联合开发(十七)--随机数与随机颜色
- SNAT的MASQUERADE地址选择与端口选择
- IPTABLES的连接跟踪与NAT分析
- IPVS分析