【问题标题】:boost::asio::deadline_timer renew still calls the handler functionboost::asio::deadline_timer renew 仍然调用处理函数
【发布时间】:2012-04-18 15:13:12
【问题描述】:

在下面的官方提升链接中: http://www.boost.org/doc/libs/1_35_0/doc/html/boost_asio/reference/deadline_timer.html.

您可以看到我们可以在异步截止时间计时器到期之前对其进行更新。没关系,代码有效: 当计时器更新时,旧的 async_wait 被取消了,这很好,但令人烦恼的是当它被取消时,它仍然调用处理程序:

void handler(const boost::system::error_code& error)
{
  if (!error)
  {
    // Timer expired.
  }
}

...

// Construct a timer with an absolute expiry time.
boost::asio::deadline_timer timer(io_service,
    boost::posix_time::time_from_string("2005-12-07 23:59:59.000"));

// Start an asynchronous wait.
timer.async_wait(handler);

更改活动的deadline_timer的到期时间

在存在挂起的异步等待时更改计时器的到期时间会导致这些等待操作被取消。要确保与计时器关联的操作只执行一次,请使用如下内容:used:

void on_some_event()
{
  if (my_timer.expires_from_now(seconds(5)) > 0)
  {
    // We managed to cancel the timer. Start new asynchronous wait.
    my_timer.async_wait(on_timeout);
  }
  else
  {
    // Too late, timer has already expired!
  }
}

void on_timeout(const boost::system::error_code& e)
{
  if (e != boost::asio::error::operation_aborted)
  {
    // Timer was not cancelled, take necessary action.
  }
}

我想知道有没有办法在不让旧计时器调用处理程序的情况下更新和取消旧计时器,在这种情况下是 on_timeout() 函数

【问题讨论】:

  • AFAICT,您在问题本身中回答了您自己的问题?在您复制粘贴的文档的示例中,on_timeout 是否已经进行了适当的检查?
  • 是的,我没有从那里复制/粘贴代码,而是我自己编写的,这就是为什么我没有在一开始就发现它的原因,但我很快就找到了它并在下面添加了一个答案。但很有趣,有人否决了这个大声笑

标签: c++ boost timer boost-asio


【解决方案1】:

可以通过在执行实际操作之前添加一行检查(查看它是否是中止/取消事件)来修复它:

void handler1(const boost::system::error_code &e)
{
    if (e != boost::asio::error::operation_aborted) // here is the important part
        {
            //do actual stuff here if it's not a cancel/abort event
        }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多