Меню

+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
|
||||
|
Временами LTR*_Stop() завершается по таймауту.Добрый вечер, Дано: Написали программу, которая работает с модулями выше по аналогии с примерами из документаций Как и в примерах, каждый модуль проходит по стандартным для него фазам: Не знаю, важно это или нет, но программа работает со всеми модулями одновременно(в отдельных потоках) и все команды выше также выполняются одновременно в параллели. Временами при остановке модулей, вызов LTR*_Stop для одного из модулей(вроде как модули всегда разные, закономерности пока не нашел) зависает на 5секунд и возвращает LTR_ERROR_NO_CMD_RESPONSE. Крейт подключен к ПК с ltrd и нашей программой напрямую через ethernet кабель. Предполагаю, что проблем сетью здесь быть не должно. Пока по воспроизведениям вижу, что такое может возникнуть в нестандартных или даже некорректных сценариях: Обычно, проблема решается повторной отправкой стоп запроса т.е. повторным выполнение функции LTR*_Stop(). Хотелось бы в целом понять, при каких сценариях возможно такое поведение(чтобы быть готовым применить какое то решение) и есть ли еще способы решить проблему, возможно более мягче. |
|||
|
||||
|
Re: Временами LTR*_Stop() завершается по таймауту.Здравствуйте. Вы вроде сами приводите порядок вызова функций, поэтому не совсем понятно, как у Вас может вызываться Stop лишний раз или без Start. Корректная работа с модулем подразумевает, что Stop вызывается на успешно выполненный Start один раз, другое использование нештатное и для определенных типов модулей действительно Stop во время не запущенного сбора приводит к такой ошибке. Если данные не вычитывать и они заполнят весь буфер, то далее из-за отсутствия места станут отбрасываться, если вызвать Stop в этот момент, то так как команды и данные передаются в LTR общим потоком для модуля, то ответ на Stop может быть отброшен из-за отсутствия места в буфера, что может привести к подобной ошибке. Но переполнение это не штатная ситуация, которая при нормальной работе не должна возникать. Также если используете несколько потоков, то функции, относящиеся к одному модулю (одном описателю) должны вызваться всегда последовательно, т.е. либо из одного потока, либо если из разных, то необходимо гарантировать, что вызываются не одновременно. Если например идет прием и обработка в одном потоке, то нельзя для этого же модуля вызвать просто так Stop или Close из другого потока, нужно вызывать либо из того же потока, либо подавать сигнал для выхода из потока, дождаться его завершения, и только потом уже вызывать Stop из другого. При корректной последовательности вызовов и штатной работе подобных проблем при вызове Stop возникать не должно. Выполнять вызов последовательности функций правильно целиком в Ваших руках, а переполнение буфера это в общем нештатная ситуация, которая по хорошему требует перезапуск сбора или вообще целиком модуля (Close/Open). Чтобы проверить, что при корректной последовательности вызовов все нормально работает, можете просто запустить параллельно по примеру на каждый модуль отдельными программами, просто поменяв настройки на нужные. |
|||
|
||||
|
Re: Временами LTR*_Stop() завершается по таймауту.Алексей L Card пишет:
У нас команды выполняются по нажатию на кнопки, грубо говоря. И бывали случаи, когда кнопки нажимали не по порядку. Видимо, таким образом и словили ошибку, описанную выше. Возник еще один вопрос, косвенно связанный с данной темой. |
|||
|
||||
|
Re: Временами LTR*_Stop() завершается по таймауту.Да, описанный подход возможен и используется (в той же LMS открытие и настройка модулей выполняется при загрузке эксперимента, а запуск сбора/генерации данных уже при нажатии кнопки запуска, которая может быть нажата сильно позже). ltrd не закрывает соединения с клиентом даже если обмена не было долгое время. |
Страницы 1
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4
Многоканальный телефон:+7 (495) 785-95-25
Письма и запросы: lcard@lcard.ru
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск