Улучшенный пример asio dead_timer

Мне нужен лучший пример boost::asio::deadline_timer

В приведенных примерах всегда истекает время ожидания и вызывается метод close. Я попытался вызвать cancel() по таймеру, но это приводит к немедленному вызову функции, переданной в async_wait.

Как правильно работать с таймерами в асинхронном TCP-клиенте?


person hookenz    schedule 17.12.2009    source источник
comment
есть причина такого поведения. Каждый вызов async_wait связан с обработчиком завершения. Отмена вызова не влияет на это.   -  person deft_code    schedule 21.12.2009


Ответы (1)


Вы упомянули, что вызов метода cancel() по таймеру приводит к немедленному вызову функции, переданной в async_wait. Это ожидаемое поведение, но помните, что вы можете проверить ошибку, переданную обработчику таймера, чтобы определить, был ли отменен таймер. Если таймер был отменен, передается operation_aborted. Например:

void handleTimer(const boost::system::error_code& error) {
    if (error == boost::asio::error::operation_aborted) {
        std::cout << "Timer was canceled" << std::endl;
    }
    else if (error) {
        std::cout << "Timer error: " << error.message() << std::endl;
    }
}

Надеюсь, это поможет. Если нет, то какой конкретный пример вы ищете?

person Yukiko    schedule 19.12.2009
comment
Отменяет ли io_service.stop() таймер? - person Martin Meeser; 07.03.2013