как проверить, активен ли boost :: deadline_timer - PullRequest
8 голосов
/ 04 января 2011

любой способ проверить, активен ли deadline_timer? например если он находится в состоянии async_wait и не был отменен?

Ответы [ 4 ]

7 голосов
/ 04 января 2011

Обработчик тайм-аута будет вызван с ошибкой, если таймер был отменен (как и обычный тайм-аут).Так не могли бы вы просто установить bool перед вызовом async_wait и затем сбросить его в обработчике, если установлено условие ошибки?

2 голосов
/ 17 ноября 2011

Как насчет этого?

boost::asio::deadline_timer mTimer;
const bool timerExpired = (mTimer.expires_at()
  <= boost::posix_time::second_clock::local_time());
2 голосов
/ 04 января 2011

На ум приходят три варианта:

  1. Создайте свой собственный класс таймера (конечно, используя deadline_timer), у которого есть собственный член do_async_wait. В этом элементе вы устанавливаете переменную-член, которую затем можно вернуть из члена bool isWaiting () или аналогичного, прежде чем вызывать async_wait для внутреннего deadline_timer. Обратите внимание, что я не думаю, что член async_wait является виртуальным, поэтому вы не можете просто наследовать от deadline_timer и переопределять. Обратите внимание, что вам также нужно будет сбросить флаг, когда вызывается ваш обработчик (делая ваш собственный таймер обработчиком, который затем перенаправляет его любому другому обработчику) или когда вызывается cancel.

  2. Отредактируйте код повышения, чтобы сделать то, что вы хотите. Насколько мне известно, это совершенно законно, однако это, конечно, не очень хороший вариант.

  3. Измените ваши требования / дизайн, чтобы вам не нужно было это знать.

1 голос
/ 04 апреля 2017

Я знаю, что на данный момент это немного устарело, но у меня есть еще одно возможное предложение: как насчет получения реализации и последующего запроса, есть ли ожидающие ожидания.Это будет выглядеть так:

mTimer.get_implementation().might_have_pending_waits
...