【问题标题】:boost asio deadline_timer提升 asio 截止时间_定时器
【发布时间】:2010-08-22 00:25:26
【问题描述】:

我希望下面的代码打印 Hello, world!每 5 秒一次,但发生的情况是程序暂停 5 秒,然后一遍又一遍地打印消息,没有后续暂停。我错过了什么?

#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;
}

【问题讨论】:

  • CancelDeadline 是干什么用的?我已经评论了这个类和CancelDeadline cd(d); boost::thread thr1(cd); 并且代码仍然有效。
  • 您可能对这个问题感兴趣:stackoverflow.com/questions/21771639/…

标签: c++ boost boost-asio


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    #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;
    }
    

    【讨论】:

    • 想添加任何类型的 cmets 吗?只有代码的答案很少能真正帮助提问者。
    【解决方案3】:

    如果您查看错误代码,您会收到操作取消错误。

    【讨论】:

    • 嗯,这很有趣,感谢您指出这一点。为什么你认为我收到操作取消错误?
    • 查看 interjay 的回复。这完全解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多