【问题标题】:Need explanation for this boost::asio timer example需要解释这个 boost::asio 计时器示例
【发布时间】:2010-03-20 02:38:33
【问题描述】:

Boost asio 的第 3 篇教程中有一行说明如何更新计时器并防止出现漂移。该行如下:

 t->expires_at(t->expires_at() + boost::posix_time::seconds(1));

也许是我,但我找不到关于 expires_at() 的第二次用法的文档,没有参数。 expires_at(x) 设置新的过期时间,取消任何待处理的完成处理程序。那么大概 expires_at() 做了什么,返回最后一次到期的时间?所以通过增加一秒,如果应该有一些毫秒,比如n毫秒,那么它本质上会从下一个到期中“减去”,因为时间正在计算?如果在本例中执行此处理程序所需的时间大于 1 秒,会发生什么情况?它会立即触发吗?

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

    expires_at() 返回设置为超时的时间。所以这会将超时时间推迟到 1 秒。

    当您使用 expires_at(x) 设置时间时,如果由于时间已经过去而已经调用它,您将获得 0 的回报。如果 return 大于 0,则表示已取消的次数。

    【讨论】:

    • 不确定我是否理解您的第一句话。 expires_at() 返回一个 posix 时间(在本例中为 posix)。但是在这行代码中,它是在完成处理程序执行的,所以过期是过去的(刚刚发生在分裂之前)。因此,如果我理解效果是您将过去的时间增加 1 秒,从而考虑到您 now 执行完成处理程序的时间(无论此行之前的任何代码)。这就是避免漂移的方法吗?否则,您将添加 1 秒 + 执行此行之前的代码所花费的时间?
    • 这将使调用处理程序的时间增加 1 秒。因此,如果您在进入处理程序之前由于某种原因有延迟,则在它再次调用处理程序之前不到一秒钟。或者在特殊情况下,它只会将它放在队列中,因为它应该已经被处理了,因为它需要很长时间才能到达这个代码。如果您认为 1s 风险很大,您可能应该使用 expires_from_now(x) 而不是从现在开始设置 1s。
    猜你喜欢
    • 2018-12-03
    • 2012-10-26
    • 2016-12-23
    • 2017-01-09
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多