| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > обертка для boost::deadline_timer |
| Автор: Michrutka 29.3.2011, 14:33 | ||||
| Здравствуйте, господа форумчане. Пишу кросплатформенный класс, реализующий таймер на основе boost::asio::deadline_timer. io_service кот, передается в конструкторе - глобальный синглтон, работающий в отдельном потоке Проблемы начинаются при уничтожении объекта. В деструкторе я вызываю cancel у таймера и жду его завершения (если необходимо) Вопрос - как мне понять, что таймер закончил работу (по собственному прерыванию, или по его методу cancel(), или _timer->expires_from_now() ? Один из вариантов - по тому, что возвращают методы cancel(), или _timer->expires_from_now(). Они возвращают кол-во асинхронных опреаций, которые они прервали. если они возращает != 0, то таймер должен вывалится в его handle с ошибкой error::operation_aborted. если кол-во прерванных операций == 0, то он никуда вываливаться не будет. НО согласно http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio/reference/deadline_timer.html "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 29.3.2011, 15:45 |
| Michrutka, фактически удалять объект надо только после отработки хэндла. |
| Автор: Michrutka 29.3.2011, 15:48 |
| bsa, ок. спасибо. по сути вопрос и сводится к тому - как понять, что таймер в хендл больше однозначно не полезет. |
| Автор: Michrutka 30.3.2011, 11:31 |
| 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 30.3.2011, 13:36 |
| Michrutka, boostcoder процитировал описание cancel() класса io_service. В твоем случае нужно делать так: if (!timer->expires_from_now()) wait_for_handler_finished(); |
| Автор: Michrutka 30.3.2011, 14:39 |
| ясно. спасибо. буду копаться. пока спасает от падений только некий тайм аут в деструкторе, что не очень красиво и хорошо. |