Странное торможение параллельных потоков

Темы связанные с инженерными разработками, но не подходящие в другие ветки форума
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: Странное торможение параллельных потоков

Сообщение Boris_K »

через инструменты Run VI / Call By Reference / Start Asynchronous Call
Это, как я понял, 3 разных метода программно вызвать другой :vi: ? Просто ни разу ещё не сталкивался с ними, вызывал просто, вызывая значок :vi: на БД. Какие преимущества могут давать эти методы, почему их так много?
отключите панель SubVI
Как именно? (могу ошибаться)
поставьте приоритет "subroutine"
Сам цикл спектрометра сабрутиной сделать не получится, т. к. там есть wait'ы в некоторых кейсах (нужно для корректной работы со спектрометром, когда спектрометр вкл/выкл измерение, и когда перезапускается, если это нужно юзеру). Но high конечно можно поставить. Кстати, пробовал выкинуть все wait'ы - не помогло.
увеличение задержки в цикле UI и уменьшение задержки в цикле получения данных (для теста можно задержку убрать полностью)
Это пробовал, в разных комбинациях (забыл написать). Результат такой: не влияет, а если в цикле получения данных убрать задержку вообще, то становится ещё хуже, т. е. подвисания дольше.
компиляция в экзешник и замер врёмен выполнения; если в exe не будет влияния на программу, то может оставить как есть
Тоже пробовал. В exe всё так же.

Остальные варианты попробую по возможности (сейчас приоритетнее саму прогу доделать, командование поставило задачу :wink: ), а работать в принципе уже можно и с этим. Отпишусь, как попробую. Спасибо большое за советы! :super:

Поток спектрометра ниже. Скрытые Case - пустые, только линии насквозь. Остальные фреймы ивент-структуры - value change контролов, и тайм-аут (считывания терминалов там нет). Почти все sub :vi: - сабрутины (большинство простенькие, просто вызов функции из dll, везде Run in any thread). Не сабрутины - только :vi: для инициализации и завершения работы со спектрометром, потому что там wait'ы есть. Но они, ес-сно, не вызываются в цикле постоянно.
Вложения
1.PNG
Race conditions - опасный и скользкий баг!
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Странное торможение параллельных потоков

Сообщение dadreamer »

Boris_K писал(а):Какие преимущества могут давать эти методы, почему их так много?
Эти методы дают дополнительный контроль над запускаемым :vi: с рядом параметров. Обычно используются при динамическом вызове SubVI или при работе с реентерантными SubVI. Но, возможно, подойдут и в вашем случае, хотя на 100% не могу сказать. Подробные описания инструментов приведены в справке :labview: .
Если кратко, то Run VI похож на обычный запуск SubVI с тем исключением, что FP не отображается при вызове, а входными параметрами служат значения панели, а не значения в проводах, заведённых на SubVI. Есть опция для того, чтобы "забыть" про запущенный SubVI и не ждать, когда он закончит своё выполнение. Перед тем, как использовать метод Run VI, нужно открыть ссылку на SubVI с помощью Open VI Reference.
Call By Reference и Start Asynchronous Call используются непосредственно для динамического вызова SubVI. Динамический вызов сокращает временные расходы и потребление памяти, т.к. SubVI загружается в память :labview: только при вызове Open VI Reference. Инструмент Call By Reference вызывает любой SubVI, чья соединительная панель совпадает с типом панели, заданным явно при вызове Open VI Reference. То есть, в ран-тайме можно вызывать динамически ряд SubVI с одинаковыми соединительными панелями (последовательно или параллельно), меняя лишь путь к подприборам и передаваемые на вход параметры. С помощью Call By Reference можно разработать систему плагинов на SubVI, если стоит такая задача.
Start Asynchronous Call используется для асинхронного запуска SubVI, т.е. :labview: не ждёт окончания работы SubVI. И этот инструмент прекрасно подходит для запуска множества реентерантных SubVI, которые должны выполняться параллельно (например, реализация многопоточности при сетевом обмене). Параметры для Start Asynchronous Call также задаются при получении ссылки с помощью Open VI Reference. Для реентерантных подприборов есть ряд опций, наиболее важными из них являются:
- Prepare for reentrant run (SubVI реентерантный и для каждого экземпляра требуется своё пространство данных);
- Enable simultaneous calls on reentrant VIs (SubVI реентерантный, для каждого экземпляра требуется своё пространство данных и клоны SubVI будут работать параллельно (например, в цикле));
- Prepare to call and forget (после вызова SubVI :labview: не будет ждать окончания работы SubVI и "забудет" о нём);
- Prepare to call and collect (после вызова SubVI необходимо подождать окончания работы SubVI с помощью Wait On Asynchronous Call, чтобы получить выходные параметры).
Однако для вашего случая можно было бы ограничиться Call By Reference, т.к. Run VI не совсем подходит из-за способа передачи параметров в SubVI, а Start Asynchronous Call вообще не уместен, т.к. не нужна асинхронность выполнения. Хотя, тормоза при работе с панелью могут и не исчезнуть при таком запуске.
Boris_K писал(а):
dadreamer писал(а):отключите панель SubVI
Как именно? (могу ошибаться)
Немного неверно выразился. Если вынесете цикл получения данных в отдельный подприбор, то панель итак не будет показываться (по умолчанию). А если оставите в Main VI, то можно попробовать убрать скроллбары, лишние кнопки, меню и т.п. в настройках внешнего вида :vi: (VI Properties -> Window Appearance).
Boris_K писал(а):Остальные фреймы ивент-структуры - value change контролов
А вот если попробовать убрать эти фреймы Value Change или вынести их в отдельный цикл, тормоза останутся? Всё-таки работа с кнопками - это больше к UI относится. Недаром же галочка "Lock panel" ставится при создании таких фреймов. Я в последнее время делаю так: все события по контролам обрабатываются в отдельном цикле с Event структурой, а остальные циклы "узнают" об этих событиях через спец. очередь "команды", которая передаёт список команд на приборы, наподобие изменения уставок, включения/выключения узлов и т.д. Хотя и появляется больше проводов на БД, это гарантированно развязывает UI и циклы по работе с данными.
По вашей диаграмме... Вроде не вижу особых причин, почему работа с панелью могла бы влиять на этот цикл. Только я бы Wait On Notification заменил на Get Notifier Status - в таком случае мы получаем значения уведомителя мгновенно без прочих задержек. А задержку цикла вы устанавливаете через константу Event Structure, которая привязана к синим часам. Случаем, переполнения очереди событий нет? Проверить можно через Event Inspector Window (ПКМ на структуре). Ну, и работу с кнопками попробуйте убрать из этого цикла просто для проверки.
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: Странное торможение параллельных потоков

Сообщение Boris_K »

А если оставите в Main VI, то можно попробовать убрать скроллбары, лишние кнопки, меню и т.п. в настройках внешнего вида :vi: (VI Properties -> Window Appearance).
Скроллбары убрать - конечно избавит из тормозов с колесом мыши, но оставит оные при сворачивании/разворачивании, перемещении и изменении размеров окна.
А вот если попробовать убрать эти фреймы Value Change или вынести их в отдельный цикл, тормоза останутся? Всё-таки работа с кнопками - это больше к UI относится.
Это пробовал, не влияет. А вот если в ивент-структуре выкинуть этот юзер ивент, тормоза пропадают.
Только я бы Wait On Notification заменил на Get Notifier Status - в таком случае мы получаем значения уведомителя мгновенно без прочих задержек
Это там специально. Там, где можно юзать Get Notifier Status - я его и юзал, т. к. действительно удобнее, не надо таймауты указывать. А Wait On Notification в тех 2-х местах использованы, чтобы отловить одиночный сигнал, т. е. они относятся к кнопкам с действием latch (первая - выход, вторая - сброс статистики), я не вносил их в ивент-структуру, т. к. для latch в ней надо считывать значение с терминала. Но, повторюсь, тормоза с этим не связаны. Пробовал также отключать lock front panel для всех ивентов.
Случаем, переполнения очереди событий нет? Проверить можно через Event Inspector Window (ПКМ на структуре)
Проверю, спасибо. Но откуда оно может взяться, ведь юзер ивент срабатывает гарантированно не чаще 1 раза в 3 мс (выдержка спектрометра 3 мс), а прога сильно проц не грузит, т. е. успевает всё обработать.
Race conditions - опасный и скользкий баг!
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Странное торможение параллельных потоков

Сообщение dadreamer »

Boris_K писал(а):Скроллбары убрать - конечно избавит из тормозов с колесом мыши, но оставит оные при сворачивании/разворачивании, перемещении и изменении размеров окна.
Тогда радикальный способ: запретить юзеру выполнять все эти манипуляции с окном. :D Вот примерно как Яков сделал: http://www.labviewportal.org/viewtopic. ... 261#p54261
Boris_K писал(а):А вот если в ивент-структуре выкинуть этот юзер ивент, тормоза пропадают.
Тогда посмею предположить, что очередь UE каким-то образом внутренне связана с очередью сообщений Windows. Другого объяснения данному феномену я не вижу. Эту догадку можно было бы проверить, состряпав простенькую DLL с вызовом PostLVUserEvent (подозреваю, ваша библиотека так же кадры в LV отсылает), а в :labview: ловить события в обычной Event структуре. Но проверить сейчас это я не могу, т.к. нет доступа ни к MSVC, ни к другой IDE, помимо :labview: . Быть может, позднее.

Вы можете сделать тестовый :vi: только с циклом и Event Structure и проверить, будут ли тормоза на таком базовом варианте. Если так, то картина в целом будет ясна.
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: Странное торможение параллельных потоков

Сообщение Boris_K »

Да, в качестве одного из способов получения сигнала о новом спектре там был ещё предложен вариант через windows messages, даже есть набор :vi: для работы с ними, вместе с "windows messages for labview.dll". Правда, библиотека древняя (1999 года) и одна функция там уже не работала (она была не нужна, а что нужно - работает). Я этот вариант пробовал, но понравился меньше. Тормозило ли там, не знаю, не проверял, ещё не знал про эту хрень. Может, займусь, но позже. Думаю, ваша догадка верна, и вариант с user event тоже внутри завязан на windows messages. А что с ними не так, это подтормаживание для них нормально? Есть ли какой-то способ устранить эти тормоза?
Race conditions - опасный и скользкий баг!
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Странное торможение параллельных потоков

Сообщение dadreamer »

dadreamer писал(а):Тогда посмею предположить, что очередь UE каким-то образом внутренне связана с очередью сообщений Windows.
Опроверг это предположение. Можем немножко модифицировать этот пример, чтобы запустить циклическую генерацию UE, а сами в это время будем выполнять "нехорошие" манипуляции с окном панели. Не знаю, как у вас, а у меня временной промежуток между событиями не изменил своего значения ни на миллисекунду. Так что имеющаяся проблема не связана с UE вообще.
Boris_K писал(а):Правда, библиотека древняя (1999 года) и одна функция там уже не работала (она была не нужна, а что нужно - работает).
Есть библиотека поновее: Windows Messages for Labview (32 bit and 64 bit support). Правда я и старой нормально пользовался. Может, не натыкался просто на проблемную функцию. Есть исходники, если что, можно переписать.
Boris_K писал(а):А что с ними не так, это подтормаживание для них нормально?
Нет. И его не должно быть. Если оно есть, то с эвентами не должно быть связано: User Events не выполняются в UI потоке. А вот что выполняется - другой вопрос. Вероятно, всё-таки где-то у вас в программе есть "узкие" места. Но дистанционно, естественно, найти их будет невозможно.
Boris_K писал(а):Есть ли какой-то способ устранить эти тормоза?
Прошерстите ещё раз весь проект, временно поотключайте блоки кода, не участвующие в наборе данных. Сделайте базовый вариант только с циклом получения данных. Посмотрите, будут ли тормоза в этом случае.
Вложения
postlv.rar
lv2011
(20.12 КБ) 120 скачиваний
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: Странное торможение параллельных потоков

Сообщение Boris_K »

Что за беда. Шерстил уже неоднократно, узких мест нет. Там вообще всё просто. Тошнит уже от перепроверки.
- Пуск -> Панель управления -> Система -> Дополнительные параметры системы -> вкладка Дополнительно -> кнопка Параметры пункта Быстродействие -> Дополнительно -> Оптимизировать работу: служб, работающих в фоновом режиме
Это попробовал, не помогло. Тестил на Win7, WinXP, как из :labview: , так и из exe.

Кстати, с предыдущей версией драйвера этого спектрометра в системе иногда случался BSOD (раз-два в неделю), причём на ровном месте, даже когда нет работы со спектрометром. Я конечно не уверен был, но они выпустили новый драйвер, уже почти месяц юзаю, BSOD'ов после обновления не было ни одного. Ещё иногда просто при выдёргивании флешки из компа (безопасном), вся работа со спектрометром повисает, вызовы к dll не возвращают управление к программе (сам спектрометр не имеет никаких сношений со съёмными носителями в компе), помогает только руками передёрнуть питание спектрометра. Вот такое чудо. Если интересно, спектрометр Avantes Avaspec ULS2048L.
Race conditions - опасный и скользкий баг!
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Странное торможение параллельных потоков

Сообщение dadreamer »

Boris_K писал(а):Ещё иногда при выдёргивании флешки (безопасном), вся работа со спектрометром повисает (вызовы к dll не возвращают управление к программе), помогает только руками передёрнуть питание спектрометра.
Ну, тут уж только сам разработчик в состоянии помочь, ибо DLL - штука скомпилированная, а отлаживать чужую библиотеку себе дороже в плане времени и энергии. Не знаю, что ещё предложить, советы закончились. Ну, кроме того, чтобы попробовать библиотеку в другой среде, это как самый крайний случай, чтоб исключить полностью специфику LabVIEW.
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1334
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 40 раз
Контактная информация:

Re: Странное торможение параллельных потоков

Сообщение AndreyDmitriev »

У меня была очень похожая проблема. Детальный профайлинг показал, что время теряется где-то при переключении контекстов потоков (если вы посмотрите в таск менеджере - там у вашего приложения потоков двадцать будет, если не больше). Решил проблему радикально - я разнёс получение данных и интерфейс на два приложения. То, приложение, которое принимает данные - оформил сервисом вообще без UI. Коммуникацию сделал через shared variables. После этого проблемы с задержками во времякритичном цикле ушли.
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: Странное торможение параллельных потоков

Сообщение Boris_K »

dadreamer, проверил ваш пример на WinXP. И наблюдаются те же симптомы. При нажатии на заголовке задержки 500 мс нет, но подтормаживания до 30 мс (обычно около 10) при вращении колеса, не всегда, но корреляция прослеживается. Причём эти подтормаживая также редко происходят сами. И типичная для WinXP задержка в 250 - 270 мс при сворачивании/разворачивании (на семёрке её нет). Добавил индикаторы, запоминающие макс. периоды циклов, с возможностью сброса, чтобы удобнее отслеживать. Проверьте. Трудно верится, что вы совсем не наблюдали подтормаживаний. Какая система?
Вложения
postlv.rar
(32.23 КБ) 129 скачиваний
Последний раз редактировалось Boris_K 27 май 2016, 21:08, всего редактировалось 2 раза.
Race conditions - опасный и скользкий баг!
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: Странное торможение параллельных потоков

Сообщение Boris_K »

Решил проблему радикально - я разнёс получение данных и интерфейс на два приложения. То, приложение, которое принимает данные - оформил сервисом вообще без UI
Как именно оформляли сервисом?
Race conditions - опасный и скользкий баг!
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Странное торможение параллельных потоков

Сообщение dadreamer »

Boris_K писал(а):Проверьте.
Проверил на домашней машине - тормозов нет. Кнопку мыши удерживал на заголовке, на кнопках "свернуть", "развернуть", "закрыть", скроллил панель, сворачивал-разворачивал, менял размеры окна, перетаскивал, "мурыжил" графики. Нет отклонений даже на 1 мс.
Boris_K писал(а):Трудно верится, что вы совсем не наблюдали подтормаживаний. Какая система?
И это так. Windows 7 Ultimate SP1 64-bit. Железо Intel Core i7-2600 CPU @ 3.40 GHz, 4 физ. ядра + 4 лог. ядра, 8 ГБ оперативки. На работе проверял тоже на семёрке x64 на 4-ядерном ПК - без тормозов.
AndreyDmitriev писал(а):Решил проблему радикально - я разнёс получение данных и интерфейс на два приложения. Коммуникацию сделал через shared variables. После этого проблемы с задержками во времякритичном цикле ушли.
Тоже один из способов, что я уже советовал в теме:
dadreamer писал(а):- компиляция цикла набора данных в отдельный exe и связь с ним через методы IPC (TCP/IP, UDP, Network Streams, SV, Pipes, Shared Memory и т.д.).
upd:
Проверил сейчас на виртуалке с Windows XP - появились тормоза в несколько мс, максимум 30-35 мс.
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: Странное торможение параллельных потоков

Сообщение Boris_K »

Проверил сейчас на виртуалке с Windows XP - появились тормоза в несколько мс, максимум 30-35 мс.
Видимо, влияет просто старая ОСь и/или старое железо, самое новое на чём я тестил - Core i7 920 (одна из первых модификаций), Win7 Pro 64 bit.

В Windows XP должно быть ещё при сворачивании/разворачивании 250 - 270 мс. Может, в виртуалке и не будет этого.
Race conditions - опасный и скользкий баг!
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: Странное торможение параллельных потоков

Сообщение Boris_K »

Новый поворот. Оказалось, дело не в user event. Давно сделал тестовый :vi: для проверки, будет ли тот или иной блок кода чувствителен к потоку UI. Там сейчас по сути голая заготовка, без всяких user events. Гонял его на своей системе (Core i7 920, Win7) - всё ок, нет задержек. А теперь просто запустил (.exe) на двух других компах с WinXP. И на обоих - всё те же симптомы! Никак этого не ожидал :shok: Так что дело в ОСи и в железе.
Вложения
UI.zip
(29.37 КБ) 118 скачиваний
Race conditions - опасный и скользкий баг!
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Странное торможение параллельных потоков

Сообщение dadreamer »

Boris_K писал(а):Так что дело в ОСи и в железе.
Видимо, плохо распараллеливаются все эти 20 потоков :labview: на 32-битных ОСях. Отсюда и симптом
AndreyDmitriev писал(а):время теряется где-то при переключении контекстов потоков
По сути используется одно ядро процессора и потоки всё равно выполняются друг за другом. Hyper Threading немного улучшает ситуацию, но не сильно. Так что меняйте ОСь.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Общие»