2010-03-20 49 views
5

第三篇教程中有一行关于Boost asio的内容,它展示了如何更新一个定时器并防止漂移。该行如下:这个boost :: asio定时器的例子需要说明

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

也许是我,但我没能找到文档关于电子xpires_at()的第二个用途,不带参数。 expires_at(x)设置新的过期时间,取消任何挂起的完成处理程序。所以大概expires_at()做什么,返回最后到期时间?因此,通过增加一秒钟,如果应该有一些毫秒数,例如n毫秒,那么它将从计算时间后的下一届到期时实质上被“减去”?如果在此示例中执行此处理程序所花的时间大于1秒,会发生什么情况?它会立即启动吗?

回答

2

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

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

+0

不知道我理解你的第一句话。 expires_at()返回一个posix时间(在这个例子中是posix)。但是在这行代码中,它正在*完成处理程序中执行,因此过期是过去的(刚刚发生了分裂)。所以如果我明白效果就是你在过去增加1秒的时间,从而说明你现在*执行完成处理程序的时间(无论这条线之前的代码是什么)。这是如何避免漂移的权利?否则,你会添加1秒+执行该代码之前的代码所用的时间? – ApplePieIsGood

+0

这会在它应该调用处理程序的时候增加1秒。因此,如果在进入处理程序之前由于某种原因而有延迟,那么在它再次调用处理程序之前不到一秒钟。或者在特殊情况下,它会将其放在队列中,因为它应该已经处理完毕,因此需要很长时间才能达到此代码。如果你认为这是一个很大的风险,那么你应该使用expires_from_now(x)来从现在开始设置1。 – jpyllman