asio同步定时器:
#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace std;
using namespace boost;
int main()
{
asio::io_service io; //所有asio程序必须要有一个io_server对象
asio::deadline_timer t(io,posix_time::seconds(2)); //定时器,io_server作为构造函数的参数,2s后定时器终止
cout<<t.expires_at() << endl; //查看终止的绝对时间
t.wait(); //调用wait()同步等待
cout << "Hello, world!\n"; //输出一条消息
}
编译:g++ -std=c++11 -o time time.cpp -lboost_system
-o:指定编译后的名称-lboost_system:指定引用system库
运行结果:
2017-Jul-05 05:55:35.392519
Hello, world!
程序解读:
定时器等待两秒,当等待结束后输出一条消息,程序结束。
asio异步定时器:
#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/system/error_code.hpp>
using namespace std;
using namespace boost::asio;
using namespace boost;
void print(const system::error_code& ) //定义回调函数,asio要求回调函数只能有一个参数,
{ //并且这个参数必须是const system::error_code&类型
cout << "hello asio" << endl;
}
int main()
{
io_service ios; //io_service对象
deadline_timer t(ios,posix_time::seconds(2)); //定时器
t.async_wait(print); //异步等待,传入回调函数,立即返回
cout << "it show before t expired." <<endl;
ios.run(); //很重要,异步IO必须
}
运行结果:
it show before t expired.
hello asio
程序解读:
第一步,创建io_service对象
第二步,创建定时器,io_service作为构造函数的参数,两秒后定时器终止
第三步,异步等待函数async_wait(),它通知io_service异步地执行IO操作,并且注册回调函数,用于在IO操作完成时由事件多路分离器分派返回值(error_code)调用。
第四步:最后必须调用io_service的run()成员函数,它启动前摄器的时间处理循环,阻塞等待所有的操作完成并分派事件。如果不调用run(),那么虽然操作被异步执行了,但没有一个等待它完成的机制,回调函数将得不到执行的机会。
当定时器时间到终止时,io_service将调用被注册的print(),输出一条消息,然后程序结束。