【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();
- }
【Boost】boost库asio详解4——deadline_timer使用说明相关推荐
- 【Boost】boost库asio详解7——boost::asio::buffer用法
1. asio::buffer常用的构造方法 asio::buffer有多种的构造方法,而且buffer大小是自动管理的 1.1 字符数组 [cpp] view plain copy print? ...
- 【Boost】boost库asio详解2——io_service::run函数无任务时退出的问题
io_service::work类可以使io_service::run函数在没有任务的时候仍然不返回,直至work对象被销毁. [cpp] view plaincopy print? void tes ...
- 【Boost】boost库asio详解9——UDP的简单例子1
服务器: #include "stdafx.h" #include <iostream> #include <boost/asio.hpp> #includ ...
- 【Boost】boost库asio详解9——TCP的简单例子2
客户端: // Client.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <iostream> #inclu ...
- 【Boost】boost库asio详解8——TCP的简单例子1
摘于boost官网的几个例子, 做了点小修改, 笔记之. 同步客户端 [cpp] view plain copy print? void test_asio_synclient() { typede ...
- 【Boost】boost库asio详解6——boost::asio::error的用法浅析
1. 概述 一般而言我们创建用于接收error的类型大多声明如下: [cpp] view plain copy print? boost::system::error_code error 我们用这 ...
- 【Boost】boost库asio详解5——resolver与endpoint使用说明
tcp::resolver一般和tcp::resolver::query结合用,通过query这个词顾名思义就知道它是用来查询socket的相应信息,一般而言我们关心socket的东东有address ...
- 【Boost】boost库asio详解3——io_service作为work pool
无论如何使用,都能感觉到使用boost.asio实现服务器,不仅是一件非常轻松的事,而且代码很漂亮,逻辑也相当清晰,这点上很不同于ACE. 使用io_service作为处理工作的work pool,可 ...
- 【Boost】boost库asio详解2——strand与io_service区别
[cpp] view plain copy print? namespace { // strand提供串行执行, 能够保证线程安全, 同时被post或dispatch的方法, 不会被并发的执行. ...
最新文章
- C++ 共用体union 的使用
- android 封装的popwindow,Android UI开发 popupwindow介绍以及代码实例
- Mac下PHP7.1+Nginx安装和配置
- 春意袭人,春装网店大比拼!
- 部署exchange邮件系统的边缘服务器
- 张北将成规模150万台服务器的云计算产业基地
- 依赖注入与Unity
- golang 标准库strings包 简介
- 字体设置_word字体设置:如何为常用字体设置快捷键
- java面试题十九 判断题
- ubuntu上wordpress安装的前置工作
- 微信小程序服务器api接口的路径,微信小程序-封装请求基准路径、接口API 和使用...
- 解决Caused by: GSSException: (Mechanism level: Failed to find any Kerberos tgt)
- Hashmap存储大小
- 【Django 2021年最新版教程3】新建一个WebApp项目并运行
- NLPIR/ICTCLAS中文分词系统 java相关api文档总结
- 【8015】对做产品有帮助的行外书
- base64、File、Blob、ArrayBuffer互转
- 免费搭建无限容量个人网盘
- jar 加入本地maven仓库
热门文章
- 数组的定义格式二_静态初始化
- DoubleCheck双重检查实战及原理解析
- e480换高分屏_全高清都不够用?是时候趁着双11上飞利浦的高分屏了
- redis(19)--事务
- Treiber Stack简单分析
- Eclipse Debug maven test
- 找不到文件、主类名和文件名不一致、缺少分号的解决方法
- 微型计算机组装实验报告虚拟,微型计算机组装与维护实训(附光盘)
- 初一七年级计算机信息全册教案,初一信息技术教案全一册
- jar打包 剔除第三方依赖以及它的依赖_为什么Spring Boot的 jar 可以直接运行?