Нужно объяснение для этого примера таймера boost::asio

В третьем руководстве по Boost asio есть строка, в которой показано, как обновить таймер и при этом предотвратить его дрейф. Строка следующая:

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

Может быть, это я, но мне не удалось найти документацию о втором использовании expires_at() без параметров. expires_at(x) устанавливает новый срок действия, отменяя все ожидающие завершения обработчики. Так что, предположительно, expires_at() возвращает время последнего истечения срока действия? Таким образом, добавляя одну секунду, если должно быть какое-то количество мс, скажем, n мс, то оно, по сути, будет «вычтено» из следующего истечения срока действия, поскольку время учитывается? Что произойдет, если время, необходимое для выполнения этого обработчика, в этом примере больше 1 секунды? Сразу загорается?


person ApplePieIsGood    schedule 20.03.2010    source источник


Ответы (1)


expires_at() возвращает время, когда установлено значение тайм-аута. Таким образом, это переместит тайм-аут на 1 секунду позже.

Когда вы устанавливаете время с expires_at(x), вы получите возврат 0, если он уже был вызван из-за уже прошедшего времени. Если возврат больше 0, это указывает на количество сделанных отмен.

person jpyllman    schedule 20.03.2010
comment
Не уверен, что понял ваше первое предложение. expires_at() возвращает время posix (в данном случае posix). но в этой строке кода он выполняется внутри обработчика завершения, поэтому истечение срока действия находится в прошлом (только что произошло мгновение назад). Итак, насколько я понимаю, эффект заключается в том, что вы добавляете время в прошлое на 1 секунду, тем самым учитывая время, которое вы тратите сейчас на выполнение обработчика завершения (какой бы код ни предшествовал этой строке). Вот как можно избежать дрейфа, верно? В противном случае вы добавляете 1 секунду + время, необходимое для выполнения кода, предшествующего этой строке? - person ApplePieIsGood; 20.03.2010
comment
Это добавит 1 секунду ко времени, которое должно было вызвать обработчик. Поэтому, если по какой-то причине у вас есть задержка перед входом в обработчик, она будет меньше одной секунды, прежде чем он снова вызовет обработчик. Или, в особом случае, он просто поставит его в очередь, потому что он уже должен был быть обработан, потому что для достижения этого кода потребовалось много времени. Если вы считаете, что 1 с слишком малы, возможно, вам следует использовать expires_from_now(x) вместо того, чтобы установить 1 с с этого момента. - person jpyllman; 20.03.2010