Многооконность, проблемы

Обсуждение, связанное с разработкой ПО верхнего уровня
AndreyDmitriev

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

Re: Многооконность, проблемы

Сообщение AndreyDmitriev »

Pavel писал(а):Если таймаут у события использовать то так же будет тормозить? Хотя тормозить будет но вот то что в таймауте должно исполняться.
ЗЫ: сори, ЛВ - нет, чтоб проверить.
Если вы имеете ввиду Event структуру с таймаутом, то она будет продолжать исполняться как обычно (если про Win7 говорить, под XP проверять право лень)
AndreyDmitriev

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

Re: Многооконность, проблемы

Сообщение AndreyDmitriev »

IvanLis писал(а):Никогда на столько не вникал во все тонкости, но в Linux мне заблокировать ничего не получилось :wink:
Вы это неправильно проверяете. Надо вызвать библиотечную функцию в UI потоке через CLFN.
Это вот так делается (мне лень там искать MessageBox, так что я просто Sleep сделал на пять секунд):
Linux.png
Как вы можете видеть, цикл без Property Node продолжил свою работу, а другой остановился на время вызова Sleep.
Попробуйте сменить опцию вызова функции c Run in UI на Reentrant и почувствуйте разницу.
Но это документированное и ожидаемое поведение. Другое дело, что индикаторы тоже не обновляются во время вызова функции, а должны бы (по крайней мере в первом цикле, если идёт вызов в UI или в обоих если Reentrant, но тут возможно дело в старой версии LabVIEW - у меня 6.1 под Убунту. А при зажимании кнопок минимизации они продолжают обновляться, это да.
Где-то так.
Аватара пользователя
dadreamer

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

Re: Многооконность, проблемы

Сообщение dadreamer »

AndreyDmitriev писал(а):Другое дело, что индикаторы тоже не обновляются во время вызова функции, а должны бы
Так индикаторы тоже находятся в UI, поток ведь один этот, разве нет? Sleep заморозил его и :labview: ждёт, пока он освободится. На мой взгляд все события на панели и возможно сама панель находится в этом потоке. Хотя у меня смутные представления о внутреннем устройстве :labview: в данном контекте.
AndreyDmitriev

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

Re: Многооконность, проблемы

Сообщение AndreyDmitriev »

dadreamer писал(а):
AndreyDmitriev писал(а):Другое дело, что индикаторы тоже не обновляются во время вызова функции, а должны бы
Так индикаторы тоже находятся в UI, поток ведь один этот, разве нет? Sleep заморозил его и :labview: ждёт, пока он освободится. На мой взгляд все события на панели и возможно сама панель находится в этом потоке. Хотя у меня смутные представления о внутреннем устройстве :labview: в данном контекте.
Это хороший вопрос. На самом деле наблюдения показывают, что там действительно всё чуть сложнее. Скажем под Windows вызовы Sleep и MessageBoxA в UI потоке ведут себя чуть по-разному. Вероятно в моём тесте под Linux необновляемость первого цикла вызвана именно использованием Sleep и версия LabVIEW тут вообще не важна. Под Windows оно себя ведёт точно также. Но одно верно - вызов DLL в UI потоке намертво останавливает циклы, в которых используются Property Nodes (ну или другие DLL в UI потоке). А с обновлением индикаторов ещё надо поиграться - там не всё тривиально. Но тут LabVIEW как "чёрный ящик" - что там под капотом - только NI знает.
Аватара пользователя
dadreamer

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

Re: Многооконность, проблемы

Сообщение dadreamer »

AndreyDmitriev, в седьмой Windows и LV 2013 я наблюдаю точно такую же ситуацию. Взял ваш пример TEST_UI.vi, при вызове MessageBoxA левый верхний цикл обновляет индикатор на панели, с вызовом Sleep - нет. После прочтения описания Sleep, этого и этого документа ясности прибавилось, но не так, чтобы очень. Мне кажется, причина - одна из этих:
1.
If the maximum number of threads is already running, no additional associated thread can run until a running thread finishes.
В этом случае :labview: выделил при запуске программы все возможные потоки, а Sleep их все заблокировал и не даёт :labview: создать ещё один для копирования значения из буфера в индикатор.

2. UI поток обменивается с исполняемым потоком сообщениями и когда вызывается Sleep, обработка сообщений прерывается. У MessageBoxA такого эффекта нет, это ведь обычное окно, лишь блокирующее UI, но не очередь сообщений.
Может быть, даже оба фактора виноваты, сложно сказать. По идее, можно дебаггером поглядеть, хотя бы насчёт второго пункта. Правда возиться не хочется.
Ответить

Вернуться в «Лицевая панель»