deadline_timer和socket一样,都用io_service作为构造函数的参数。也即,在其上进行异步操作,都将导致和io_service所包含的iocp相关联。这同样意味着在析构 io_service之前,必须析构关联在这个io_service上的deadline_timer。

1. 构造函数

在构造deadline_timer时指定时间。

[cpp] view plain copy  print?
  1. basic_deadline_timer(
  2. boost::asio::io_service & io_service);
  3. basic_deadline_timer(
  4. boost::asio::io_service & io_service,
  5. const time_type & expiry_time);
  6. basic_deadline_timer(
  7. boost::asio::io_service & io_service,
  8. const duration_type & expiry_time);

注意后两种的区别。以下2种用法是等价的:

[cpp] view plain copy  print?
  1. boost::asio::deadline_timer t(io, boost::posix_time::microsec_clock::universal_time()+boost::posix_time::seconds(5));
  2. boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));

前者是绝对时间,后者是相对时间。

2. 同步

一个deadline_timer只维护一个超时时间,一个deadline_timer不同时维持多个定时器。

[cpp] view plain copy  print?
  1. void wait();
  2. void wait(boost::system::error_code& ec);

这是个同步等待函数,例如:

[cpp] view plain copy  print?
  1. boost::asio::io_service io;
  2. boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
  3. t.wait();

由于不涉及到异步,该函数和io_service没什么关系。这个函数在windows下的实现就只是简单的sleep。因此也就不存在cancel之说。

3. 异步

[cpp] view plain copy  print?
  1. template<typename WaitHandler>
  2. void async_wait(WaitHandler handler);

注意这个error很重要,表明这个handler是因为超时被执行还是因为被cancel。
符合2种情况之一,handler被执行:超时或者被cancel。
这同时隐含的说明了除非io.stop被调用,否则handler一定会被执行。即便是被cancel。
被cancel有多种方法,直接调用cancel或者调用expires_at,expires_from_now重新设置超时时间。

4. 例子

[cpp] view plain copy  print?
  1. namespace
  2. {
  3. void print(const boost::system::error_code&)
  4. {
  5. PRINT_DEBUG("Hello, world!");
  6. }
  7. void handle_wait(const boost::system::error_code& error,
  8. boost::asio::deadline_timer& t,
  9. int& count)
  10. {
  11. if(!error)
  12. {
  13. PRINT_DEBUG(count);
  14. if(count++ < 5)
  15. {
  16. t.expires_from_now(boost::posix_time::seconds(3));
  17. t.async_wait(boost::bind(handle_wait,
  18. boost::asio::placeholders::error,
  19. boost::ref(t),
  20. boost::ref(count)));
  21. if (count == 3)
  22. {
  23. t.cancel();
  24. }
  25. }
  26. }
  27. }
  28. }
  29. // 同步方法
  30. void test_timer_syn()
  31. {
  32. boost::asio::io_service ios;
  33. boost::asio::deadline_timer t(ios, boost::posix_time::seconds(3));
  34. PRINT_DEBUG(t.expires_at());
  35. t.wait();
  36. PRINT_DEBUG("Hello syn deadline_timer!");
  37. }
  38. // 异步方法: 3秒后执行print方法.
  39. void test_timer_asyn()
  40. {
  41. boost::asio::io_service io;
  42. boost::asio::deadline_timer t(io, boost::posix_time::seconds(3));
  43. t.async_wait(print);
  44. PRINT_DEBUG("After async_wait...");
  45. io.run();
  46. }
  47. // 异步循环执行方法:
  48. void test_timer_asyn_loop()
  49. {
  50. boost::asio::io_service io;
  51. boost::asio::deadline_timer t(io);
  52. size_t a = t.expires_from_now(boost::posix_time::seconds(1));
  53. int count = 0;
  54. t.async_wait(boost::bind(handle_wait,
  55. boost::asio::placeholders::error,
  56. boost::ref(t),
  57. boost::ref(count)));
  58. io.run();
  59. }

【Boost】boost库asio详解4——deadline_timer使用说明相关推荐

  1. 【Boost】boost库asio详解7——boost::asio::buffer用法

    1. asio::buffer常用的构造方法 asio::buffer有多种的构造方法,而且buffer大小是自动管理的 1.1 字符数组 [cpp] view plain copy  print? ...

  2. 【Boost】boost库asio详解2——io_service::run函数无任务时退出的问题

    io_service::work类可以使io_service::run函数在没有任务的时候仍然不返回,直至work对象被销毁. [cpp] view plaincopy print? void tes ...

  3. 【Boost】boost库asio详解9——UDP的简单例子1

    服务器: #include "stdafx.h" #include <iostream> #include <boost/asio.hpp> #includ ...

  4. 【Boost】boost库asio详解9——TCP的简单例子2

    客户端: // Client.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <iostream> #inclu ...

  5. 【Boost】boost库asio详解8——TCP的简单例子1

    摘于boost官网的几个例子, 做了点小修改, 笔记之. 同步客户端 [cpp] view plain copy  print? void test_asio_synclient() { typede ...

  6. 【Boost】boost库asio详解6——boost::asio::error的用法浅析

    1. 概述 一般而言我们创建用于接收error的类型大多声明如下: [cpp] view plain copy  print? boost::system::error_code error 我们用这 ...

  7. 【Boost】boost库asio详解5——resolver与endpoint使用说明

    tcp::resolver一般和tcp::resolver::query结合用,通过query这个词顾名思义就知道它是用来查询socket的相应信息,一般而言我们关心socket的东东有address ...

  8. 【Boost】boost库asio详解3——io_service作为work pool

    无论如何使用,都能感觉到使用boost.asio实现服务器,不仅是一件非常轻松的事,而且代码很漂亮,逻辑也相当清晰,这点上很不同于ACE. 使用io_service作为处理工作的work pool,可 ...

  9. 【Boost】boost库asio详解2——strand与io_service区别

    [cpp] view plain copy  print? namespace { // strand提供串行执行, 能够保证线程安全, 同时被post或dispatch的方法, 不会被并发的执行. ...

最新文章

  1. C++ 共用体union 的使用
  2. android 封装的popwindow,Android UI开发 popupwindow介绍以及代码实例
  3. Mac下PHP7.1+Nginx安装和配置
  4. 春意袭人,春装网店大比拼!
  5. 部署exchange邮件系统的边缘服务器
  6. 张北将成规模150万台服务器的云计算产业基地
  7. 依赖注入与Unity
  8. golang 标准库strings包 简介
  9. 字体设置_word字体设置:如何为常用字体设置快捷键
  10. java面试题十九 判断题
  11. ubuntu上wordpress安装的前置工作
  12. 微信小程序服务器api接口的路径,微信小程序-封装请求基准路径、接口API 和使用...
  13. 解决Caused by: GSSException: (Mechanism level: Failed to find any Kerberos tgt)
  14. Hashmap存储大小
  15. 【Django 2021年最新版教程3】新建一个WebApp项目并运行
  16. NLPIR/ICTCLAS中文分词系统 java相关api文档总结
  17. 【8015】对做产品有帮助的行外书
  18. base64、File、Blob、ArrayBuffer互转
  19. 免费搭建无限容量个人网盘
  20. jar 加入本地maven仓库

热门文章

  1. 数组的定义格式二_静态初始化
  2. DoubleCheck双重检查实战及原理解析
  3. e480换高分屏_全高清都不够用?是时候趁着双11上飞利浦的高分屏了
  4. redis(19)--事务
  5. Treiber Stack简单分析
  6. Eclipse Debug maven test
  7. 找不到文件、主类名和文件名不一致、缺少分号的解决方法
  8. 微型计算机组装实验报告虚拟,微型计算机组装与维护实训(附光盘)
  9. 初一七年级计算机信息全册教案,初一信息技术教案全一册
  10. jar打包 剔除第三方依赖以及它的依赖_为什么Spring Boot的 jar 可以直接运行?