头文件
#include <boost/aiso/steady_timer.hpp>
#include <boost/aiso/system_timer.hpp>
#include <boost/aiso/high_resolution_timer.hpp>
理论
asio库提供四个定时器:
- deadline_timer
- steady_timer
- system_timer
- high_resolution_timer
这四个类的接口都是一样的,区别:
- deadline_timer是asio早期版本提供的,使用boost.data_time提供时间支持。
- steady_timer、system_timer、high_resolution_timer使用std::chrono或者boost::chrono时钟类提供时间支持
目标类basic_waitable_timer是定时器的真正实现,steady_timer、system_timer、high_resolution_timer是basic_waitable_timer的模板特化。
- 定时器提供三种形式的构造参数:
- 第一个:io_service,用于提交IO请求
- 第二个:定时器的终止时间,可以是绝对时间点或者相对当前时间点的时间长度
- 一旦定时创建,它就会马上开始计时,可以使用成员函数wait()来同步等待定时器终止,或者使用
asyno_wait()
异步等待- 当定时器到期时,会终止并调用
handler
函数 - handler形式必须是: void handler(const error_code &ec);
- 虽然asyno_wait()接受的回调函数类型是固定的,但是可以使用bind配合占位符placeholders::error来绑定参数来适配它的接口。
- lambda表达式可以达到与bind相同的效果,由于它的捕获列表可以自动获得所有外部变量,所有写起来更方便更推荐
- 当定时器到期时,会终止并调用
- 如果定时器不指定终止时间,定时器就不会工作
- 可以用成员函数
expires_at()
或者expires_from_now()
分别设置定时器的终止时间点和相对时间,然后在调用wait()
或者async_wait()
等待 expires_at()
或者expires_from_now()
的无参形式可以用于获取定时器的终止时间
- 可以用成员函数
- 其cancel()函数会传递error::operation_aborted错误码通知所有异步操作取消,返回已经取消的handler数量。cancel_one()同handler(),但是它一次只取消一个
同步定时器
实例
功能: 定时器同步等待500ms,当等待结束后输出一条消息
steady_timer VS sleep():
- thread库的sleep()使用了互斥量和条件变量,在线程中等待
- asio调用了操作系统的异步机制比如epoll完成的,没有多线程竞争
异步定时器
实例:
实例:异步连接服务器,如果超过500ms还没有连接成功,就关闭socket