boost-asio学习1——定时器(同步、异步)

时间:2022-09-09 00:11:45

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_servicerun()成员函数,它启动前摄器的时间处理循环,阻塞等待所有的操作完成并分派事件。如果不调用run(),那么虽然操作被异步执行了,但没有一个等待它完成的机制,回调函数将得不到执行的机会。

当定时器时间到终止时,io_service将调用被注册的print(),输出一条消息,然后程序结束。