Если вы имеете ввиду Event структуру с таймаутом, то она будет продолжать исполняться как обычно (если про Win7 говорить, под XP проверять право лень)Pavel писал(а):Если таймаут у события использовать то так же будет тормозить? Хотя тормозить будет но вот то что в таймауте должно исполняться.
ЗЫ: сори, ЛВ - нет, чтоб проверить.
Многооконность, проблемы
-
- VIP
- Сообщения: 1327
- Зарегистрирован: 03 фев 2010, 00:42
- Награды: 6
- Версия LabVIEW: 6.1 - 2024
- Откуда: Германия
- Благодарил (а): 1 раз
- Поблагодарили: 38 раз
- Контактная информация:
Re: Многооконность, проблемы
-
- VIP
- Сообщения: 1327
- Зарегистрирован: 03 фев 2010, 00:42
- Награды: 6
- Версия LabVIEW: 6.1 - 2024
- Откуда: Германия
- Благодарил (а): 1 раз
- Поблагодарили: 38 раз
- Контактная информация:
Re: Многооконность, проблемы
Вы это неправильно проверяете. Надо вызвать библиотечную функцию в UI потоке через CLFN.IvanLis писал(а):Никогда на столько не вникал во все тонкости, но в Linux мне заблокировать ничего не получилось
Это вот так делается (мне лень там искать MessageBox, так что я просто Sleep сделал на пять секунд): Как вы можете видеть, цикл без Property Node продолжил свою работу, а другой остановился на время вызова Sleep.
Попробуйте сменить опцию вызова функции c Run in UI на Reentrant и почувствуйте разницу.
Но это документированное и ожидаемое поведение. Другое дело, что индикаторы тоже не обновляются во время вызова функции, а должны бы (по крайней мере в первом цикле, если идёт вызов в UI или в обоих если Reentrant, но тут возможно дело в старой версии LabVIEW - у меня 6.1 под Убунту. А при зажимании кнопок минимизации они продолжают обновляться, это да.
Где-то так.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 126 раз
- Контактная информация:
Re: Многооконность, проблемы
Так индикаторы тоже находятся в UI, поток ведь один этот, разве нет? Sleep заморозил его и ждёт, пока он освободится. На мой взгляд все события на панели и возможно сама панель находится в этом потоке. Хотя у меня смутные представления о внутреннем устройстве в данном контекте.AndreyDmitriev писал(а):Другое дело, что индикаторы тоже не обновляются во время вызова функции, а должны бы
-
- VIP
- Сообщения: 1327
- Зарегистрирован: 03 фев 2010, 00:42
- Награды: 6
- Версия LabVIEW: 6.1 - 2024
- Откуда: Германия
- Благодарил (а): 1 раз
- Поблагодарили: 38 раз
- Контактная информация:
Re: Многооконность, проблемы
Это хороший вопрос. На самом деле наблюдения показывают, что там действительно всё чуть сложнее. Скажем под Windows вызовы Sleep и MessageBoxA в UI потоке ведут себя чуть по-разному. Вероятно в моём тесте под Linux необновляемость первого цикла вызвана именно использованием Sleep и версия LabVIEW тут вообще не важна. Под Windows оно себя ведёт точно также. Но одно верно - вызов DLL в UI потоке намертво останавливает циклы, в которых используются Property Nodes (ну или другие DLL в UI потоке). А с обновлением индикаторов ещё надо поиграться - там не всё тривиально. Но тут LabVIEW как "чёрный ящик" - что там под капотом - только NI знает.dadreamer писал(а):Так индикаторы тоже находятся в UI, поток ведь один этот, разве нет? Sleep заморозил его и ждёт, пока он освободится. На мой взгляд все события на панели и возможно сама панель находится в этом потоке. Хотя у меня смутные представления о внутреннем устройстве в данном контекте.AndreyDmitriev писал(а):Другое дело, что индикаторы тоже не обновляются во время вызова функции, а должны бы
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 126 раз
- Контактная информация:
Re: Многооконность, проблемы
AndreyDmitriev, в седьмой Windows и LV 2013 я наблюдаю точно такую же ситуацию. Взял ваш пример TEST_UI.vi, при вызове MessageBoxA левый верхний цикл обновляет индикатор на панели, с вызовом Sleep - нет. После прочтения описания Sleep, этого и этого документа ясности прибавилось, но не так, чтобы очень. Мне кажется, причина - одна из этих:
1.
2. UI поток обменивается с исполняемым потоком сообщениями и когда вызывается Sleep, обработка сообщений прерывается. У MessageBoxA такого эффекта нет, это ведь обычное окно, лишь блокирующее UI, но не очередь сообщений.
Может быть, даже оба фактора виноваты, сложно сказать. По идее, можно дебаггером поглядеть, хотя бы насчёт второго пункта. Правда возиться не хочется.
1.
В этом случае выделил при запуске программы все возможные потоки, а Sleep их все заблокировал и не даёт создать ещё один для копирования значения из буфера в индикатор.If the maximum number of threads is already running, no additional associated thread can run until a running thread finishes.
2. UI поток обменивается с исполняемым потоком сообщениями и когда вызывается Sleep, обработка сообщений прерывается. У MessageBoxA такого эффекта нет, это ведь обычное окно, лишь блокирующее UI, но не очередь сообщений.
Может быть, даже оба фактора виноваты, сложно сказать. По идее, можно дебаггером поглядеть, хотя бы насчёт второго пункта. Правда возиться не хочется.