这个boost::asio定时器示例需要解释说明。

5

在Boost asio的第三个教程中,有一行代码展示了如何重新启动一个定时器并防止出现漂移。该行代码如下:

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

也许是我自己的问题,但我找不到关于 expires_at() 的第二种用法的文档,没有参数。 expires_at(x) 设置新的过期时间,取消任何挂起的完成处理程序。因此,expires_at() 所做的是什么,返回最后到期的时间?因此,通过添加一秒钟,如果应该有一些毫秒数,比如 n 毫秒,则将从下一个到期时间中“减去”,因为时间已经被计算了?如果在这个例子中执行此处理程序所需的时间大于 1 秒会发生什么?它会立即触发吗?
1个回答

2

expires_at()函数返回设置超时时间的时间。所以这会将超时时间延后1秒。

当你使用expires_at(x)设置时间时,如果已经由于时间已过而调用,则返回0。如果返回值大于0,则表示已取消的次数。


不确定我是否理解您的第一句话。expires_at()返回一个posix时间(在这种情况下是posix)。但在这行代码中,它正在完成处理程序内执行,因此过期已经过去(刚刚发生了一瞬间)。所以如果我理解正确,效果就是你在过去添加了1秒钟的时间,从而计算出你现在花费的时间来完成处理程序(在这行代码之前的任何代码)。这就是如何避免漂移的,对吗?否则,您将添加1秒钟+执行此行代码之前的代码所需的时间? - ApplePieIsGood
这将会在原本应该调用处理程序的时间上增加1秒。因此,如果在进入处理程序之前由于某种原因有延迟,那么在再次调用处理程序之前不到一秒钟。或者在特殊情况下,它将只是将其放入队列中,因为它应该已经被处理了,因为它花费太长时间才到达这段代码。如果您认为1秒钟的风险太大,那么最好使用expires_from_now(x)来设置从现在开始的1秒钟。 - jpyllman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接