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