Boost asio deadline_timer, bug?
Hi Is this a bug, or am I doing something wrong? #include <iostream> #include <boost/asio.hpp> #include <boost/bind.hpp> using namespace std; using namespace boost::asio; struct A { A(io_service & service) : timer1(service), timer2(service) { timer1.expires_from_now( boost::posix_time::seconds(5) ); timer1.async_wait(boost::bind(&A::handler, this, _1)); timer2.expires_from_now( boost::posix_time::seconds(2) ); timer2.async_wait(boost::bind(&A::interrupt, this, _1)); } void handler(const boost::system::error_code &ec) { cout << "Forbidden handler" << endl; assert(0); } void handler_interrupted(const boost::system::error_code &ec) { cout << "Hello world" << endl; } void interrupt(const boost::system::error_code &ec) { cout << "Interrupted" << endl; int res = timer1.cancel(); assert(res > 0); timer1.expires_from_now( boost::posix_time::milliseconds(0) ); timer1.async_wait(boost::bind(&A::handler_interrupted, this, _1)); } int count, max, timeout1, timeout2; deadline_timer timer1; deadline_timer timer2; }; int main() { io_service service; A a(service); service.run(); return 0; }
Allan Nielsen wrote:
Is this a bug, or am I doing something wrong?
No bug here (I think), as per [1], a cancelled operation will be invoked with an error code - this is so one can discern between a normal invocation and a cancel or error. Your handler could be updated like so: void handler(const boost::system::error_code &ec) { if (!ec) { cout << "Forbidden handler" << endl; assert(0); } else cout << "Timer1 interrupted by someone." << endl; } 1: http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/reference/basic_dea...
Hello, Allan, Using boost::asio::io_service::stop() member function, you can cancel/interrupt other handlers. The following code show that only one handler (rather than 3 ones) would be executed: #include <iostream> #include <boost/asio.hpp> #include <boost/bind.hpp> using namespace boost::asio; class A { public: A(io_service &is) : ios(is), timer1(ios), timer2(ios), timer3(ios) { timer1.expires_from_now(boost::posix_time::seconds(5)); timer1.async_wait(boost::bind(&A::handler, this, _1)); timer2.expires_from_now(boost::posix_time::seconds(1)); timer2.async_wait(boost::bind(&A::interrupt, this, _1) ); } private: io_service &ios; deadline_timer timer1; deadline_timer timer2; deadline_timer timer3; void handler(const boost::system::error_code &e) { if (!e) { std::cout << "Forbidden handler" << std::endl; } else throw boost::system::error_code(e); } void interrupt(const boost::system::error_code &e) { if (!e) { std::cout << "Interrupted" << std::endl; ios.stop(); timer3.expires_from_now(boost::posix_time::milliseconds(1) ); timer3.async_wait(boost::bind(&A::handle_interrupt, this, _1) ); } else throw boost::system::error_code(e); } void handle_interrupt(const boost::system::error_code &e) { if (!e) { std::cout << "Hellow world" << std::endl; } else throw boost::system::error_code(e); } }; int main() { try { boost::asio::io_service ios; A a(ios); ios.run(); } catch (std::exception &e ) { std::cout << e.what() << std::endl; } return 0; } Robert On Fri, Aug 19, 2011 at 3:25 AM, Allan Nielsen <a@awn.dk> wrote:
Hi
Is this a bug, or am I doing something wrong?
#include <iostream> #include <boost/asio.hpp> #include <boost/bind.hpp>
using namespace std; using namespace boost::asio;
struct A { A(io_service & service) : timer1(service), timer2(service) { timer1.expires_from_now( boost::posix_time::seconds(5) ); timer1.async_wait(boost::bind(&A::handler, this, _1));
timer2.expires_from_now( boost::posix_time::seconds(2) ); timer2.async_wait(boost::bind(&A::interrupt, this, _1)); }
void handler(const boost::system::error_code &ec) { cout << "Forbidden handler" << endl; assert(0); }
void handler_interrupted(const boost::system::error_code &ec) { cout << "Hello world" << endl; }
void interrupt(const boost::system::error_code &ec) { cout << "Interrupted" << endl; int res = timer1.cancel(); assert(res > 0);
timer1.expires_from_now( boost::posix_time::milliseconds(0) ); timer1.async_wait(boost::bind(&A::handler_interrupted, this, _1)); }
int count, max, timeout1, timeout2; deadline_timer timer1; deadline_timer timer2; };
int main() { io_service service; A a(service); service.run();
return 0; }
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
participants (4)
-
Allan Nielsen
-
Arash Partow
-
Boost lzw
-
Igor R