代码之家  ›  专栏  ›  技术社区  ›  shaz

升压asio定时器

  •  11
  • shaz  · 技术社区  · 15 年前

    #include <iostream>
    #include <boost/asio.hpp>
    #include <boost/date_time/posix_time/posix_time.hpp>
    
    using namespace boost::asio;
    using namespace std;
    
    io_service io;
    
    void print(const boost::system::error_code& /*e*/)
    {
      cout << "Hello, world!\n";
      deadline_timer t(io, boost::posix_time::seconds(5));
      t.async_wait(print);
    }
    
    
    int main()
    {
    
      deadline_timer t(io, boost::posix_time::seconds(5));
      t.async_wait(print);
    
      io.run();
    
      return 0;
    }
    

    编辑以在下面添加工作代码。谢谢你们。

    #include <iostream>
    #include <boost/bind.hpp>
    #include <boost/thread.hpp>
    #include <boost/asio.hpp>
    #include <boost/date_time/posix_time/posix_time.hpp>
    
    using namespace boost::asio;
    using namespace std;
    
    class Deadline {
    public:
        Deadline(deadline_timer &timer) : t(timer) {
            wait();
        }
    
        void timeout(const boost::system::error_code &e) {
            if (e)
                return;
            cout << "tick" << endl;
            wait();
        }
    
        void cancel() {
            t.cancel();
        }
    
    
    private:
        void wait() {
            t.expires_from_now(boost::posix_time::seconds(5));
            t.async_wait(boost::bind(&Deadline::timeout, this, boost::asio::placeholders::error));
        }
    
        deadline_timer &t;
    };
    
    
    class CancelDeadline {
    public:
        CancelDeadline(Deadline &d) :dl(d) { }
        void operator()() {
            string cancel;
            cin >> cancel;
            dl.cancel();
            return;
        }
    private:
        Deadline &dl;
    };
    
    
    
    int main()
    {
        io_service io;
        deadline_timer t(io);
        Deadline d(t);
        CancelDeadline cd(d);
        boost::thread thr1(cd);
        io.run();
        return 0;
    }
    
    3 回复  |  直到 13 年前
        1
  •  26
  •   interjay    15 年前

    你在创造 deadline_timer 作为局部变量,然后立即退出函数。这将导致计时器自毁并取消自身,并使用忽略的错误代码调用函数,从而导致无限循环。

    使用存储在成员或全局变量中的单个计时器对象可以解决此问题。

        2
  •  3
  •   firstlight    12 年前
    #include <iostream>
    #include <boost/asio.hpp>
    #include <boost/date_time/posix_time/posix_time.hpp>
    
    using namespace boost::asio;
    using namespace std;
    
    io_service io;
    
    deadline_timer t(io, boost::posix_time::seconds(5));
    
    void print(const boost::system::error_code& /*e*/)
    {
      cout << "Hello, world!\n";
      t.expires_from_now(boost::posix_time::seconds(5));
      t.async_wait(print);
    }
    
    
    int main()
    {
    
      //deadline_timer t(io, boost::posix_time::seconds(5));
      t.async_wait(print);
    
      io.run();
    
      return 0;
    }
    
        3
  •  2
  •   Bill Lynch    15 年前

    如果您查看错误代码,就会发现操作取消错误。

    推荐文章