【问题标题】:how to check if boost::deadline_timer is active如何检查 boost::deadline_timer 是否处于活动状态
【发布时间】:2011-01-04 13:03:46
【问题描述】:

有什么方法可以检查deadline_timer 是否处于活动状态?例如如果它处于 async_wait 状态并且没有被取消?

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

    如果定时器被取消(以及正常的超时),超时处理程序将被调用并带有错误条件。那么你能不能在调用 async_wait 之前简单地设置一个布尔值,然后在设置了错误条件时在处理程序中重置它?

    【讨论】:

    • 是的,我只是在检查我是否没有错过deadline_timer界面中的某些内容
    【解决方案2】:

    想到三个选项:

    1. 创建您自己的计时器类(当然使用deadline_timer),它有自己的do_async_wait 成员。在此成员中,您设置一个成员变量,然后可以从 bool isWaiting() 成员或类似成员返回,然后再调用内部截止时间计时器上的 async_wait。请注意,我不认为 async_wait 成员是虚拟的,因此您不能只继承自 dead_timer 并覆盖。请注意,您还需要在调用处理程序时(通过将您自己的计时器设置为处理程序,然后转发到任何其他处理程序)或调用取消时重置标志。

    2. 编辑 boost 代码来做你想做的事。据我所知,这是完全合法的,但这当然不是一个很好的选择。

    3. 更改您的要求/设计,这样您就不需要知道这一点。

    【讨论】:

      【解决方案3】:

      这个怎么样?

      boost::asio::deadline_timer mTimer;
      const bool timerExpired = (mTimer.expires_at()
        <= boost::posix_time::second_clock::local_time());
      

      【讨论】:

      • 这行不通,因为计时器不能保证准时到期。
      • 它与其他计时器有何不同?
      • 它与任何其他计时器没有什么不同。但是,如果您使用此代码来检测计时器是否处于活动状态,则会出现竞争条件,在该条件下,它将在计时器到期之前的一小段时间内返回 true。例如,如果你使用它来检查释放内存是否安全,你的程序就会崩溃。
      • 欢迎提出更好的解决方案。
      【解决方案4】:

      我知道这在这一点上有点老了,但我有另一个可能的建议:获取实现然后请求是否可能存在待处理的等待。它看起来像这样:

      mTimer.get_implementation().might_have_pending_waits
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-11
        • 2019-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-06
        • 1970-01-01
        • 2021-03-22
        相关资源
        最近更新 更多