一.构造函数
一个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进行包裹。
时间: 2024-10-27 03:45:31