Волшебник
64 / 63 / 7
Регистрация: 21.11.2009
Сообщений: 319
1

Boost::asio::read как заставить работать с таймаутом?

26.03.2015, 19:24. Показов 3475. Ответов 14
Метки нет (Все метки)

При чтении данных из порта, если нет ответа, то поток уходит в бесконечное ожидание.
Может кто-то уже сталкивался с подобной проблемой, помогите пожалуйста!)
Нужно установить тайм аут на чтение.

Вот сама ф-ция чтения из порта:
C++
1
2
3
4
5
void cCPort::readDataFromNetwork(unsigned char *transmitData, int readSize) {
    if (m_Port.is_open()) {
        boost::asio::read(m_Port, boost::asio::buffer(transmitData, readSize));
    }
}

Заранее большое спасибо!
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2015, 19:24
Ответы с готовыми решениями:

Не получается заставить CMake работать с boost
Сколько уже перечитал топиков - без толку. Не работает. Имеется: - Windows 10 - CLion 2018.1.6...

Как сделать http запрос в boost.asio?
Здравствуйте. Как сделать запрос в с++ пользуясь boost asio Например на c# все просто. ...

Boost::asio как обнаружить дисконнект на удалённой машине?
В данный момент обрабатываю дисконнекты, глядя на возвращаемые коды ошибок после вызовов...

Как корректно считать вектор boost::asio::streambuf на стороне клиента
Доброго времени суток! Назрел вопрос: Пишу в сокет с помощью boost::asio::buffer...

14
Don't worry, be happy
17213 / 10089 / 1948
Регистрация: 27.09.2012
Сообщений: 25,185
Записей в блоге: 1
26.03.2015, 22:27 2
http://stackoverflow.com/quest... th-timeout
оно?
1
В астрале
Эксперт С++
8035 / 4792 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.03.2015, 15:47 3
Rapsod, async_read + timer.
0
Эксперт С++
8289 / 6120 / 613
Регистрация: 10.12.2010
Сообщений: 28,612
Записей в блоге: 30
27.03.2015, 15:55 4
А для синхронного режима, нет таймаутов? Как в WinSoks? Правильно я понимаю?
0
Jesus loves me
Эксперт С++
5196 / 3168 / 357
Регистрация: 12.12.2009
Сообщений: 8,007
Записей в блоге: 2
12.05.2015, 13:58 5
Цитата Сообщение от Avazart Посмотреть сообщение
А для синхронного режима, нет таймаутов? Как в WinSoks? Правильно я понимаю?
На сколько я понял в этом случае таймаут будет просто как sleep() работать. Могу ошибаться, только начал книжку по boost::asio читать.
0
Эксперт С++
8289 / 6120 / 613
Регистрация: 10.12.2010
Сообщений: 28,612
Записей в блоге: 30
12.05.2015, 13:59 6
Цитата Сообщение от Kastaneda Посмотреть сообщение
На сколько я понял в этом случае таймаут будет просто как sleep() работать.
Как WaitForSingleObject()
0
Jesus loves me
Эксперт С++
5196 / 3168 / 357
Регистрация: 12.12.2009
Сообщений: 8,007
Записей в блоге: 2
21.05.2015, 21:31 7
Цитата Сообщение от Avazart Посмотреть сообщение
Как WaitForSingleObject()
На сколько я понял речь же о deadline_timer?
Вот, что в книге, которую я читаю, пишут
Boost.Asio allows for synchronous timers as well, but they are usually equivalent to a simple sleep operation. The boost::this_thread::sleep(500); code and the following snippet of code accomplish the same thing:
C++
1
2
deadline_timer t(service, boost::posix_time::milliseconds(500));
t.wait();
Книга называется "Boost Asio C++ Network Programming"
0
Эксперт С++
8289 / 6120 / 613
Регистрация: 10.12.2010
Сообщений: 28,612
Записей в блоге: 30
21.05.2015, 21:41 8
Цитата Сообщение от Kastaneda Посмотреть сообщение
simple sleep operation.
Ну тут важно какой sleep, системный/виндовый при котором замирание без досрочного прерывания или бустовский который может реагировать на внешние факты и прерываться досрочно например при прерывании потока.
0
1355 / 501 / 69
Регистрация: 21.07.2015
Сообщений: 1,277
22.07.2015, 22:30 9
Я рекомендую использовать steady_timer, он не привязан к системному времени (со всеми вытекающими из этого неприятностями). Задать явно таймаут в asio нельзя (по крайней мере я не знаю таких способов), но можно по таймеру отменить операцию с портом (вызвать cancel, емнип). После этого по порту придет событие с ошибкой, что операция принудительно прервана.
0
Эксперт С++
8289 / 6120 / 613
Регистрация: 10.12.2010
Сообщений: 28,612
Записей в блоге: 30
22.07.2015, 22:38 10
Ну как я понимаю использование таймера не эквивалентно таймауту чтения.
К примеру мы не можем знать зарание сколько времени уйдет на загрузку файла (не зная его размера и скорости передачи) что бы выставить это время в таймере.
0
1355 / 501 / 69
Регистрация: 21.07.2015
Сообщений: 1,277
22.07.2015, 23:09 11
Цитата Сообщение от Avazart Посмотреть сообщение
Ну как я понимаю использование таймера не эквивалентно таймауту чтения.
К примеру мы не можем знать зарание сколько времени уйдет на загрузку файла (не зная его размера и скорости передачи) что бы выставить это время в таймере.
Честно говоря не понял замечания. Если передавать файл не целиком а кусками, то все прекрасно рассчитывается. Я работал с помощью ASIO с COM-портом, а там все таймауты ответов жестко определены в протоколе на железку и таких вопросов вообще не возникает...

Добавлено через 23 минуты
И да, если есть непреодолимое желание реализовать аналог блокирующего чтения с выходом таймауту, то можно не заниматься шаманством с sleep, а использовать для этого io_sevice::run(). Он блокирует поток, пока не завершатся все активные операции. Соответственно по событию чтения прерываем таймер, а по таймеру чтение.
0
Эксперт С++
8289 / 6120 / 613
Регистрация: 10.12.2010
Сообщений: 28,612
Записей в блоге: 30
22.07.2015, 23:15 12
Цитата Сообщение от shmkv Посмотреть сообщение
Честно говоря не понял замечания. Если передавать файл не целиком а кусками, то все прекрасно рассчитывается.
А если целиком? Например по HTTP ?
0
1355 / 501 / 69
Регистрация: 21.07.2015
Сообщений: 1,277
22.07.2015, 23:43 13
Хорошо, а какое поведение тогда требуется (в контексте таймаута)?
0
Эксперт С++
8289 / 6120 / 613
Регистрация: 10.12.2010
Сообщений: 28,612
Записей в блоге: 30
23.07.2015, 13:51 14
Цитата Сообщение от shmkv Посмотреть сообщение
Хорошо, а какое поведение тогда требуется (в контексте таймаута)?
Таймаут отсчитывается от приема поледней принятой "порции" данных. А не с самого начала приема.
0
1355 / 501 / 69
Регистрация: 21.07.2015
Сообщений: 1,277
23.07.2015, 17:24 15
Ну про такую возможность я не знаю, хотя мне этого и не требовалось никогда.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.07.2015, 17:24

Boost.Asio. Как получить ответ от сервера в формате json или xml
Все привет, столкнулся с проблемой. Допустим, с помощью boost.asio и OpenSSL я делаю GET запрос...

Как заставить сайт написанный на 5.3 заставить работать на 5.6? Как принудительно включить register_globals?
Есть древний сайт. Работает на php 5.3. Как объяснил разработчик данного сайта - все дело в...

Qt boost asio
Добого времени суток Пробую написать программу для приема изображения, которое приходит в виде...

boost::asio
начал ковырять буст. Возник вопрос с созданием клинт-серверного приложения. Для ознакомления хочу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.