![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Michrutka |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 6.2.2008 Репутация: нет Всего: нет |
Здравствуйте, господа форумчане.
Пишу кросплатформенный класс, реализующий таймер на основе boost::asio::deadline_timer. io_service кот, передается в конструкторе - глобальный синглтон, работающий в отдельном потоке Проблемы начинаются при уничтожении объекта. В деструкторе я вызываю cancel у таймера и жду его завершения (если необходимо) Вопрос - как мне понять, что таймер закончил работу (по собственному прерыванию, или по его методу cancel(), или _timer->expires_from_now() ? Один из вариантов - по тому, что возвращают методы cancel(), или _timer->expires_from_now(). Они возвращают кол-во асинхронных опреаций, которые они прервали. если они возращает != 0, то таймер должен вывалится в его handle с ошибкой error::operation_aborted. если кол-во прерванных операций == 0, то он никуда вываливаться не будет. НО согласно документации "The boost::asio::basic_deadline_timer::expires_from_now() function cancels any pending asynchronous waits, and returns the number of asynchronous waits that were cancelled. If it returns 0 then you were too late and the wait handler has already been executed, or will soon be executed. If it returns 1 then the wait handler was successfully cancelled. " То есть он може твернуть 0, и при этом вывалится в хендл. и, конечно же, он это делает, когда объекта уже не существует, и приложение на этом месте падает. То есть 100% определить будет ли вызван handler после вызова cancel(), или _timer->expires_from_now() невозможно?? Собственно, код: *.h :
*.cpp :
Вот и вопрос - как грамотно дождаться полной отработки таймера, может ли при этом помочь удаление объекта - таймера? Заранее спасибо. |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Michrutka, фактически удалять объект надо только после отработки хэндла.
|
|||
|
||||
Michrutka |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 6.2.2008 Репутация: нет Всего: нет |
bsa, ок. спасибо.
по сути вопрос и сводится к тому - как понять, что таймер в хендл больше однозначно не полезет. |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
cancel() и в хэндлере проверяешь состояние ошибки.
Добавлено через 3 минуты и 41 секунду
если количество прерванных операций равно нулю, то это означает что операций нет, что в свою очередь означает что ни одна операция не была прервана, что в свою очередь означает что никакой хэндлер в любом случае не будет вызван ;) |
|||
|
||||
Michrutka |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 6.2.2008 Репутация: нет Всего: нет |
boostcoder,
но "The boost::asio::basic_deadline_timer::expires_from_now() function cancels any pending asynchronous waits, and returns the number of asynchronous waits that were cancelled. If it returns 0 then you were too late and the wait handler has already been executed, or will soon be executed. If it returns 1 then the wait handler was successfully cancelled. " это означает что он вот-вот туда вывалиться? и отработает? разве нет? |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Michrutka, boostcoder процитировал описание cancel() класса io_service.
В твоем случае нужно делать так: if (!timer->expires_from_now()) wait_for_handler_finished(); Это сообщение отредактировал(а) bsa - 30.3.2011, 13:39 |
|||
|
||||
Michrutka |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 6.2.2008 Репутация: нет Всего: нет |
ясно. спасибо.
буду копаться. пока спасает от падений только некий тайм аут в деструкторе, что не очень красиво и хорошо. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |