В третьем руководстве по Boost asio есть строка, в которой показано, как обновить таймер и при этом предотвратить его дрейф. Строка следующая:
t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
Может быть, это я, но мне не удалось найти документацию о втором использовании expires_at()
без параметров. expires_at(x)
устанавливает новый срок действия, отменяя все ожидающие завершения обработчики. Так что, предположительно, expires_at() возвращает время последнего истечения срока действия? Таким образом, добавляя одну секунду, если должно быть какое-то количество мс, скажем, n мс, то оно, по сути, будет «вычтено» из следующего истечения срока действия, поскольку время учитывается? Что произойдет, если время, необходимое для выполнения этого обработчика, в этом примере больше 1 секунды? Сразу загорается?