![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
если вызвать io_service.run() не передав до этого ему обработчиков - он сразу же вернет управление
если вызывать io_service.run() в цикле - получится busy-wait (пустой цикл в потоке, 100% загрузка проца) как сделать так, чтобы io_service.run() ждал обработчиков? |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
нужно создать объект класса boost::asio::io_service::work и передать в конструктор ссылку на io_service
пока этот объект существует, run не будет возвращать управление |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
Lazin, спасибо.
|
|||
|
||||
| boostcoder |
|
||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
стоит заметить следующее: т.к. некоторые хендлеры могут бросать исключения, происходит выход из run(). в документации по этому поводу предложено следующее решение:
но тут не оговорено поведение io_service по отношению к io_service::work при появлении исключения. а происходит следующее: когда мы получаем исключение из хендлера, io_service "отцепляется" от io_service::work. и если при повторном вызове run(), в этот момент в очереди нет хендлеров, то поток прекратит выполняться и вернет управление. что есть не совсем то что нам нужно. как io_service обратно "прицепить" к io_service::work я так и не понял. решается следующим способом:
немного через попу...но ничего лучше не придумал Это сообщение отредактировал(а) boostcoder - 19.11.2010, 02:05 |
||||||
|
|||||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
в этом случае io_service::work вообще не нужен.
|
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
boostcoder, а кто мешает io_service::work воткнуть внутрь try{}catch перед run?
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
хм... сначала эта идея показалась мне гениальной. но проверив, обнаружил что при повторном входе в try блок, io_service не блокируется как ожидалось. может что-то в моем коде не так.. разбираюсь..
Это сообщение отредактировал(а) boostcoder - 19.11.2010, 18:37 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
если что-то не так, то это очень похоже на баг asio.
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
нет. никак не цепляется.
напишу в поддержку. любопытно. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |