2010-03-20 48 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