标签:
一.构造函数
一个deadline_timer只维护一个超时时间,一个deadline_timer不同时维护多个定时器。在构造deadline_timer时指定时间:
1 basic_deadline_timer(boost::asio::io_service & io_service);
2
3 basic_deadline_timer( boost::asio::io_service & io_service,
4 const time_type & expiry_time);
5
6 basic_deadline_timer(boost::asio::io_service & io_service,
7 const duration_type & expiry_time);
二.同步定时器
由于不涉及到异步,该函数和io_service没有什么关系。只是简单的sleep。
1 boost::asio::io_service io;
2 boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
3 t.wait();
三.异步定时器
由于涉及到异步,该函数需要io_service来运行run,进行调度。
1 boost::asio::io_service io;
2 boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
3 t.async_wait(handler);
四.例子
1 #include<boost/asio.hpp>
2 #include<boost/ref.hpp>
3 #include<iostream>
4
5
6 using namespace std;
7 typedef function<void (const boost::system::error_code&)> timer_callback ;
8
9 void print(const boost::system::error_code&)
10 {
11 cout << "async timer."<<endl;
12 }
13
14 void bindPrint(const boost::system::error_code & err,boost::asio::deadline_timer &timer)
15 {
16 cout<<"bind loop async timer."<<endl;
17 timer.expires_at(timer.expires_at() + boost::posix_time::seconds(5));
18 timer.async_wait(std::bind(bindPrint, std::placeholders::_1, boost::ref(timer)));
19 }
20
21
22 int main()
23 {
24 boost::asio::io_service io;
25
26 //1.基本的同步定时器
27 boost::asio::deadline_timer timer1(io, boost::posix_time::seconds(5));
28 timer1.wait();
29
30 //2.基本的异步定时器
31 boost::asio::deadline_timer timer2(io, boost::posix_time::seconds(5));
32 timer2.async_wait(print);
33
34 //3.使用lambda来生成回调函数
35 boost::asio::deadline_timer timer3(io, boost::posix_time::seconds(5));
36 timer_callback callback = [&](const boost::system::error_code& err)
37 {
38 cout<<"lambda loop async timer."<<endl;
39 timer3.expires_at(timer3.expires_at() + boost::posix_time::seconds(5));
40 timer3.async_wait(callback);
41 };
42 timer3.async_wait(callback);
43
44 //4.使用bind来生成回调函数
45 boost::asio::deadline_timer timer4(io, boost::posix_time::seconds(5));
46 timer4.async_wait(std::bind(bindPrint, std::placeholders::_1, boost::ref(timer4)));
47
48 io.run();
49 return 0;
50 }
五.补充
1.deadline_timer的计时是在定义后,即timer构造函数完成后就开始,而不是调用wait()或者async_wati()后开始计时。
2.deadline_timer不能进行拷贝的,所以在bind中必须使用boost::ref进行包裹。
boost.asio系列(一)——deadline_timer
标签:
原文地址:http://www.cnblogs.com/cauchy007/p/5079952.html