deadline_timer使用说明
【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时指定时间。
- basic_deadline_timer(
- boost::asio::io_service & io_service);
- basic_deadline_timer(
- boost::asio::io_service & io_service,
- const time_type & expiry_time);
- basic_deadline_timer(
- boost::asio::io_service & io_service,
- const duration_type & expiry_time);
注意后两种的区别。以下2种用法是等价的:
查看文本打印
- boost::asio::deadline_timer t(io, boost::posix_time::microsec_clock::universal_time()+boost::posix_time::seconds(5));
- boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
前者是绝对时间,后者是相对时间。
2. 同步
一个deadline_timer只维护一个超时时间,一个deadline_timer不同时维持多个定时器。
查看文本打印
- void wait();
- void wait(boost::system::error_code& ec);
这是个同步等待函数,例如:
查看文本打印
- boost::asio::io_service io;
- boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
- t.wait();
由于不涉及到异步,该函数和io_service没什么关系。这个函数在windows下的实现就只是简单的sleep。因此也就不存在cancel之说。
3. 异步
查看文本打印
- template<typename WaitHandler>
- void async_wait(WaitHandler handler);
注意这个error很重要,表明这个handler是因为超时被执行还是因为被cancel。
符合2种情况之一,handler被执行:超时或者被cancel。
这同时隐含的说明了除非io.stop被调用,否则handler一定会被执行。即便是被cancel。
被cancel有多种方法,直接调用cancel或者调用expires_at,expires_from_now重新设置超时时间。
4. 例子
查看文本打印
- namespace
- {
- void print(const boost::system::error_code&)
- {
- PRINT_DEBUG("Hello, world!");
- }
- void handle_wait(const boost::system::error_code& error,
- boost::asio::deadline_timer& t,
- int& count)
- {
- if(!error)
- {
- PRINT_DEBUG(count);
- if(count++ < 5)
- {
- t.expires_from_now(boost::posix_time::seconds(3));
- t.async_wait(boost::bind(handle_wait,
- boost::asio::placeholders::error,
- boost::ref(t),
- boost::ref(count)));
- if (count == 3)
- {
- t.cancel();
- }
- }
- }
- }
- }
- // 同步方法
- void test_timer_syn()
- {
- boost::asio::io_service ios;
- boost::asio::deadline_timer t(ios, boost::posix_time::seconds(3));
- PRINT_DEBUG(t.expires_at());
- t.wait();
- PRINT_DEBUG("Hello syn deadline_timer!");
- }
- // 异步方法: 3秒后执行print方法.
- void test_timer_asyn()
- {
- boost::asio::io_service io;
- boost::asio::deadline_timer t(io, boost::posix_time::seconds(3));
- t.async_wait(print);
- PRINT_DEBUG("After async_wait...");
- io.run();
- }
- // 异步循环执行方法:
- void test_timer_asyn_loop()
- {
- boost::asio::io_service io;
- boost::asio::deadline_timer t(io);
- size_t a = t.expires_from_now(boost::posix_time::seconds(1));
- int count = 0;
- t.async_wait(boost::bind(handle_wait,
- boost::asio::placeholders::error,
- boost::ref(t),
- boost::ref(count)));
- io.run();
- }
上一篇 Windows Phone 7, Android and iOS with Mono IV: Webservices | 下一篇 Storm 8推iOS连连看类游戏:不考虑上市 |
文章评论 以下网友留言只代表其个人观点,不代表本网站的观点和立场。
deadline_timer使用说明相关推荐
- 【Boost】boost库asio详解4——deadline_timer使用说明
deadline_timer和socket一样,都用io_service作为构造函数的参数.也即,在其上进行异步操作,都将导致和io_service所包含的iocp相关联.这同样意味着在析构 io_s ...
- abaqus高性能服务器怎么用,高性能计算平台ABAQUS任务调度使用说明作者陈林E-Mailchenlin.PDF...
高性能计算平台ABAQUS任务调度使用说明作者陈林E-Mailchenlin.PDF 高性能计算平台ABAQUS 任务调度使用说明 作者:陈林 E-Mail:chenlin@ 日期:2017-1-10 ...
- linux 文件拷贝并替换,Linux_cmd replace 文件替换使用说明,帮助信息: 复制代码 代码如 - phpStudy...
cmd replace 文件替换使用说明 帮助信息: 复制代码 代码如下: 替换文件. REPLACE [drive1:][path1]filename [drive2:][path2] [/A] [ ...
- Simple Dynamic Strings(SDS)源码解析和使用说明二
在<Simple Dynamic Strings(SDS)源码解析和使用说明一>文中,我们分析了SDS库中数据的基本结构和创建.释放等方法.本文将介绍其一些其他方法及实现.(转载请指明出于 ...
- Delphi开发的IOCP测试Demo以及使用说明。
Delphi开发的IOCP,此为压力测试Demo和使用说明.
- oracle database link mysql_oracle database link使用说明
oracle database link使用说明 作用: 将多个oracle数据库逻辑上看成一个数据库,也就是说在一个数据库中可以操作另一个数据库中的对象. 简易语法: CREATE [PUBLIC] ...
- 序列拼接工具Bowtie使用说明
序列拼接工具Bowtie使用说明 2011-06-08 ~ ADMIN Bowtie是一个超级快速的,较为节省内存的短序列拼接至模板基因组的工具.它在拼接35碱基长度的序列时,可以达到每小时2.5亿次 ...
- benchmarksql测试mysql_数据库压力测试工具 -- BenchmarkSQL 使用说明
关于数据库的压力测试,之前写过3篇Blog: 数据库基准测试(Database Benchmarking) 说明 数据库压力测试工具 -- Hammerdb 使用说明 数据库压力测试工具 -- Swi ...
- 计算机网页基础课专业,关于《计算机应用基础》课程网页下的学习资源使用说明....
关于<计算机应用基础>课程网页下的学习资源使用说明. 关于<计算机应用基础>课程网页下的学习资源使用说明 各位同学:大家好! 07春学期已接近一半的时间了,新生对课程还需要更多 ...
最新文章
- Python urllib和urllib2模块学习(一)
- 三级下拉框连动的数据库版
- JVM之类加载器ClassLoader
- 京瓷1020怎么打印自检页_喷墨打印机如何打印自检页
- 百度安全DDoS攻击年度报告出炉 企业防护有新招!
- 首发联发科天玑820!Redmi 10X发布:售价1599元起
- hadop 查看DataNode的资源使用情况信息(web接口)
- JSON.toJSONString()空字段不忽略
- mysqlreport 文档
- java关联查询实战_MyBatis初级实战之六:一对多关联查询
- vi/vim编辑器常用命令
- ue4风格化材质_在UE4中制作风格化场景:Bird House_资源库
- 让生如夏花之绚烂 死如秋叶之静美 (全诗)
- SwiftUI Xcode教程之在 iOS 中使用Schemes 和 .xcconfig 文件来组织构建交付
- POS机行业获客新思路,如何高效推广,且看明白这几点
- Excel操作:制作to do list
- rust怎么拆除墙壁指令_腐蚀RUST指令大全
- python安装失败0x80070570_0x80070570 文件或目录损坏且无法读取 CHKDSK 修复方法
- 解决垃圾小米文件管理器删除文件后存储空间不变,内存不变大,不释放空间。解决方法:点图中那个结束运行,再重新打开软件(直接滑动退出后台无效果)
- 使用Nodejs创建一个Web服务器应如何操作?以及路由相关知识了解