一.构造函数

  一个deadline_timer只维护一个超时时间,一个deadline_timer不同时维护多个定时器。在构造deadline_timer时指定时间:

  1. basic_deadline_timer(boost::asio::io_service & io_service);
  2.  
  3. basic_deadline_timer( boost::asio::io_service & io_service,
  4. const time_type & expiry_time);
  5.  
  6. basic_deadline_timer(boost::asio::io_service & io_service,
  7. const duration_type & expiry_time);

二.同步定时器

  由于不涉及到异步,该函数和io_service没有什么关系。只是简单的sleep。

  1. boost::asio::io_service io;
  2. boost::asio::deadline_timer t(io, boost::posix_time::seconds());
  3. t.wait();

三.异步定时器

  由于涉及到异步,该函数需要io_service来运行run,进行调度。

  1. boost::asio::io_service io;
  2. boost::asio::deadline_timer t(io, boost::posix_time::seconds());
  3. t.async_wait(handler);

四.例子

  1. #include<boost/asio.hpp>
  2. #include<boost/ref.hpp>
  3. #include<iostream>
  4.  
  5. using namespace std;
  6. typedef function<void (const boost::system::error_code&)> timer_callback ;
  7.  
  8. void print(const boost::system::error_code&)
  9. {
  10. cout << "async timer."<<endl;
  11. }
  12.  
  13. void bindPrint(const boost::system::error_code & err,boost::asio::deadline_timer &timer)
  14. {
  15. cout<<"bind loop async timer."<<endl;
  16. timer.expires_at(timer.expires_at() + boost::posix_time::seconds());
  17. timer.async_wait(std::bind(bindPrint, std::placeholders::_1, boost::ref(timer)));
  18. }
  19.  
  20. int main()
  21. {
  22. boost::asio::io_service io;
  23.  
  24. //1.基本的同步定时器
  25. boost::asio::deadline_timer timer1(io, boost::posix_time::seconds());
  26. timer1.wait();
  27.  
  28. //2.基本的异步定时器
  29. boost::asio::deadline_timer timer2(io, boost::posix_time::seconds());
  30. timer2.async_wait(print);
  31.  
  32. //3.使用lambda来生成回调函数
  33. boost::asio::deadline_timer timer3(io, boost::posix_time::seconds());
  34. timer_callback callback = [&](const boost::system::error_code& err)
  35. {
  36. cout<<"lambda loop async timer."<<endl;
  37. timer3.expires_at(timer3.expires_at() + boost::posix_time::seconds());
  38. timer3.async_wait(callback);
  39. };
  40. timer3.async_wait(callback);
  41.  
  42. //4.使用bind来生成回调函数
  43. boost::asio::deadline_timer timer4(io, boost::posix_time::seconds());
  44. timer4.async_wait(std::bind(bindPrint, std::placeholders::_1, boost::ref(timer4)));
  45.  
  46. io.run();
  47. return ;
  48. }

五.补充

1.deadline_timer的计时是在定义后,即timer构造函数完成后就开始,而不是调用wait()或者async_wati()后开始计时。

2.deadline_timer不能进行拷贝的,所以在bind中必须使用boost::ref进行包裹。

boost.asio系列(一)——deadline_timer的更多相关文章

  1. boost.asio系列——Timer

    同步Timer asio中提供的timer名为deadline_timer,它提供了超时计时的功能.首先以一个最简单的同步Timer为例来演示如何使用它. #include<iostream&g ...

  2. boost.asio系列——socket编程

    asio的主要用途还是用于socket编程,本文就以一个tcp的daytimer服务为例简单的演示一下如何实现同步和异步的tcp socket编程. 客户端 客户端的代码如下: #include &l ...

  3. boost.asio系列——io_service

    IO模型 io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象). asio::io_service i ...

  4. boost.asio系列——buffer

    创建buffer 在io操作中,对数据的读写大都是在一个缓冲区上进行的,在asio框架中,可以通过asio::buffer函数创建一个缓冲区来提供数据的读写.buffer函数本身并不申请内存,只是提供 ...

  5. boost::asio::deadline_timer(理解)

    并发与并行: 并发和并行从宏观上来讲都是同时处理多路请求的概念.但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔内发生. 1.Timer.1 - 使 ...

  6. boost.asio源码剖析(五) ---- 泛型与面向对象的完美结合

    有人说C++是带类的C:有人说C++是面向对象编程语言:有人说C++是面向过程与面向对象结合的语言.类似的评论网上有很多,虽然正确,却片面,是断章取义之言. C++是实践的产物,C++并没有为了成为某 ...

  7. 如何在多线程leader-follower模式下正确的使用boost::asio。

    #include <assert.h> #include <signal.h> #include <unistd.h> #include <iostream& ...

  8. BOOST.Asio——Tutorial

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  啥说的,鄙视那些无视版权随 ...

  9. BOOST.Asio——Overview

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  啥说的,鄙视那些无视版权随 ...

随机推荐

  1. python 调试命令

    部分整理自:http://flysnowxf.iteye.com/blog/1327677 启动调试: python -m pdb xxx.py 常用命令说明: l #查看运行到哪行代码 n #单步运 ...

  2. jacksi(比较实用的工具批处理)

    批处理类别: 国产软件 批处理语言: 简体中文 授权方式: 免费软件 运行环境: Windows平台 警告:运行BAT源码是一种危险的动作,如果你不熟悉,请不要尝试! 这里分享的是用bat写的比较实用 ...

  3. shell脚本中常用命令

    1           Shell中的特殊符号 1.1           $  美元符号.用来表示变量的值.如变量NAME的值为Mike,则使用$NAME就可以得到“Mike”这个值. 1.2    ...

  4. nginx错误

    在开发的时候遇到nginx错误 网上找了半天也没有找到解决方案: 先查看了一下nginx错误日志 cat /usr/local/nginx/logs/error.log 然后发现看不太懂 那么只能重启 ...

  5. POJ1061(线性同余方程)

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 105587   Accepted: 20789 Descript ...

  6. [转载]PCI/PCIe基础——配置空间

    转载地址:http://blog.csdn.net/jiangwei0512/article/details/51603525 PCI/PCIe设备有自己的独立地址空间,这部分空间会映射到整个系统的地 ...

  7. 问题:asp.net 点击button按钮调到页面顶部;结果:asp.net点击一个按钮,使页面跳转到本面页上的指定位置

    asp.net点击一个按钮,使页面跳转到本面页上的指定位置 (2011-04-19 16:46:51) 转载▼ 标签: it   最近在做一个项目. 用到标题所说的功能. 实现方法: 1.在aspx中 ...

  8. sqlserver 使用维护计划备份

    https://www.cnblogs.com/teafree/p/4240040.html

  9. 部署和调优 1.1 nfs部署和优化-2

    更改共享目录文件默认的所有者和所属组 已知道客户端有个user11用户 cat /etc/passwd user11:x:501:501::/home/user11:/bin/bash 服务端打开 v ...

  10. 使用mui框架后a标签无法跳转

    由于最近工作项目上使用到前台mui框架,笔者在将H5转换为jsp时,遇见各种各样问题,原因归结为对mui框架不熟悉,今天就遇见一个特别奇怪的问题,界面中超链接<a>标签无法跳转,笔者试着添 ...