Для некоторого уточнения нужны abous Boost asio, асинхронные операции и таймеры - PullRequest
5 голосов
/ 25 февраля 2011

Есть один аспект таймеров в асинхронных соединениях, который я хочу знать, правильно ли я понимаю.

Предположим, что мы установили таймер перед выполнением операции чтения, которая включает в себя обработчик, а затем run() io_service.

Как я понял, io_service заканчивается, как только менеджер заканчивается после вызова, что может произойти по двум причинам:

a) операция чтения завершена.

b) таймер достиг своего предела.

Предположим, что выполнено первое (a) условие и операция чтения завершена до окончания таймера.

Вопрос: что происходит с этим таймером?Мы должны закончить это.Скажите

dTimer_.expires_from_now (boost::posix_time::seconds(0));

after the io_service.run()?

Можете ли вы сбросить его на новый интервал, если необходимо повторно использовать тот же объект таймера для другой операции чтения?

Можно ли сбросить () io_service и повторно использовать тот же объектв новом run() для этой новой операции?

1 Ответ

8 голосов
/ 25 февраля 2011

Вопрос: что происходит с этим таймером?Нужно ли нам закончить это?

Обработчик таймера будет по-прежнему вызываться, если вы не отмените это

void my_read_handler() {
     dTimer_.cancel(); // remember to catch exceptions
}

async_wait handler будетпередал код ошибки из boost::asio::error::operation_aborted, если он был успешно отменен.Если async_wait завершено до cancel, а обработчик уже был поставлен в очередь io_service, ваш обработчик должен будет обнаружить это условие и соответствующим образом отреагировать.


Можете ли высбросить его на новый интервал, если необходимо повторно использовать тот же объект таймера для другой операции чтения?

Deadline_timer может быть reset с использованием expires_from_now

Эта функция устанавливает время истечения.Все ожидающие асинхронные операции ожидания будут отменены.Обработчик для каждой отмененной операции будет вызываться с кодом ошибки boost :: asio :: error :: operation_aborted.


Могу ли я сбросить () io_service и повторно использовать то же самое?объект в новом run () для этой новой операции?

Тот же самый объект io_service может быть снова использован для run() или poll() после сброса it.

Эта функция должна вызываться до любого второго или более позднего набора вызовов функций run (), run_one (), poll () или poll_one (), когда предыдущий вызов этих функций возвращался из-заio_service остановлен или не работает.Эта функция позволяет io_service сбрасывать любое внутреннее состояние, например флаг «остановлен».

...