【Boost】boost库asio详解四——deadline_timer使用说明

分类: 移动开发/ IOS/ 文章

【Boost】boost库asio详解4——deadline_timer使用说明
deadline_timer和socket一样,都用io_service作为构造函数的参数。也即,在其上进行异步操作,都将导致和io_service所包含的iocp相关联。这同样意味着在析构 io_service之前,必须析构关联在这个io_service上的deadline_timer。

1. 构造函数

在构造deadline_timer时指定时间。

  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种用法是等价的:

查看文本打印

  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不同时维持多个定时器。

查看文本打印

  1. void wait();
  2. void wait(boost::system::error_code& ec);

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

查看文本打印

  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. 异步

查看文本打印

  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. 例子

查看文本打印

  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. }
上一篇 Windows Phone 7, Android and iOS with Mono IV: Webservices 下一篇 Storm 8推iOS连连看类游戏:不考虑上市

 文章评论 以下网友留言只代表其个人观点,不代表本网站的观点和立场。

deadline_timer使用说明相关推荐

  1. 【Boost】boost库asio详解4——deadline_timer使用说明

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

  2. abaqus高性能服务器怎么用,高性能计算平台ABAQUS任务调度使用说明作者陈林E-Mailchenlin.PDF...

    高性能计算平台ABAQUS任务调度使用说明作者陈林E-Mailchenlin.PDF 高性能计算平台ABAQUS 任务调度使用说明 作者:陈林 E-Mail:chenlin@ 日期:2017-1-10 ...

  3. linux 文件拷贝并替换,Linux_cmd replace 文件替换使用说明,帮助信息: 复制代码 代码如 - phpStudy...

    cmd replace 文件替换使用说明 帮助信息: 复制代码 代码如下: 替换文件. REPLACE [drive1:][path1]filename [drive2:][path2] [/A] [ ...

  4. Simple Dynamic Strings(SDS)源码解析和使用说明二

    在<Simple Dynamic Strings(SDS)源码解析和使用说明一>文中,我们分析了SDS库中数据的基本结构和创建.释放等方法.本文将介绍其一些其他方法及实现.(转载请指明出于 ...

  5. Delphi开发的IOCP测试Demo以及使用说明。

    Delphi开发的IOCP,此为压力测试Demo和使用说明.

  6. oracle database link mysql_oracle database link使用说明

    oracle database link使用说明 作用: 将多个oracle数据库逻辑上看成一个数据库,也就是说在一个数据库中可以操作另一个数据库中的对象. 简易语法: CREATE [PUBLIC] ...

  7. 序列拼接工具Bowtie使用说明

    序列拼接工具Bowtie使用说明 2011-06-08 ~ ADMIN Bowtie是一个超级快速的,较为节省内存的短序列拼接至模板基因组的工具.它在拼接35碱基长度的序列时,可以达到每小时2.5亿次 ...

  8. benchmarksql测试mysql_数据库压力测试工具 -- BenchmarkSQL 使用说明

    关于数据库的压力测试,之前写过3篇Blog: 数据库基准测试(Database Benchmarking) 说明 数据库压力测试工具 -- Hammerdb 使用说明 数据库压力测试工具 -- Swi ...

  9. 计算机网页基础课专业,关于《计算机应用基础》课程网页下的学习资源使用说明....

    关于<计算机应用基础>课程网页下的学习资源使用说明. 关于<计算机应用基础>课程网页下的学习资源使用说明 各位同学:大家好! 07春学期已接近一半的时间了,新生对课程还需要更多 ...

最新文章

  1. Python urllib和urllib2模块学习(一)
  2. 三级下拉框连动的数据库版
  3. JVM之类加载器ClassLoader
  4. 京瓷1020怎么打印自检页_喷墨打印机如何打印自检页
  5. 百度安全DDoS攻击年度报告出炉 企业防护有新招!
  6. 首发联发科天玑820!Redmi 10X发布:售价1599元起
  7. hadop 查看DataNode的资源使用情况信息(web接口)
  8. JSON.toJSONString()空字段不忽略
  9. mysqlreport 文档
  10. java关联查询实战_MyBatis初级实战之六:一对多关联查询
  11. vi/vim编辑器常用命令
  12. ue4风格化材质_在UE4中制作风格化场景:Bird House_资源库
  13. 让生如夏花之绚烂 死如秋叶之静美 (全诗)
  14. SwiftUI Xcode教程之在 iOS 中使用Schemes 和 .xcconfig 文件来组织构建交付
  15. POS机行业获客新思路,如何高效推广,且看明白这几点
  16. Excel操作:制作to do list
  17. rust怎么拆除墙壁指令_腐蚀RUST指令大全
  18. python安装失败0x80070570_0x80070570 文件或目录损坏且无法读取 CHKDSK 修复方法
  19. 解决垃圾小米文件管理器删除文件后存储空间不变,内存不变大,不释放空间。解决方法:点图中那个结束运行,再重新打开软件(直接滑动退出后台无效果)
  20. 使用Nodejs创建一个Web服务器应如何操作?以及路由相关知识了解

热门文章

  1. DFS,BFS和迭代加深的联系与区别
  2. 1600-卡斯丁狗要吃糖葫芦 ZCMU
  3. iOS QQ空间 好友分享
  4. html 提示语为英文,7个公共场所常见的英文提示语,建议收藏!
  5. Linux man page命令后的数字含义
  6. 模拟器左下方数字含义
  7. Git+Gitlab+Ansible剧本实现一键部署动态网站(二)--技术流ken
  8. NLP在线医生(一)
  9. php kestrel,转载 kestrel php 讯息队列
  10. 2021年各大互联网大厂年终奖一览表~新年干劲十足