boost.asio系列(一)——deadline_timer

一.构造函数

  一个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进行包裹。

原文地址:https://www.cnblogs.com/cauchy007/p/5079952.html