Задизейблить много кнопок за раз
-
- interested
- Сообщения: 9
- Зарегистрирован: 24 окт 2016, 17:05
- Версия LabVIEW: 2015
- Контактная информация:
Задизейблить много кнопок за раз
Привет.
Такой вопрос: Нужно в определенный момент работы программы задизейблить много разных кнопок и панелей. Я делаю это созданием Property Node-ов, но беда в том, что это занимает огромный объем в программе (Понимаю, что она резиновая, но не эстетично). Сделать SubVI тоже не вариант, т.к. все эти ноды принимаются подпрограммой на входе, потому места занимает не меньше. Можно ли как-то решить проблему с этим?
Заранее спасибо.
Такой вопрос: Нужно в определенный момент работы программы задизейблить много разных кнопок и панелей. Я делаю это созданием Property Node-ов, но беда в том, что это занимает огромный объем в программе (Понимаю, что она резиновая, но не эстетично). Сделать SubVI тоже не вариант, т.к. все эти ноды принимаются подпрограммой на входе, потому места занимает не меньше. Можно ли как-то решить проблему с этим?
Заранее спасибо.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Задизейблить много кнопок за раз
- Вложения
-
- Enable-Disable Buttons.vi
- lv2015
- (12.73 КБ) 132 скачивания
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Задизейблить много кнопок за раз
В 2016 и выше можно использовать вот этот тулкит - https://forums.ni.com/t5/UI-Interest-Gr ... -p/3539490. Тогда проперти ноды вообще не будут нужны...
Мы делили апельсин - много наших полегло...
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Задизейблить много кнопок за раз
Но ведь внутри тулкита по-прежнему вызываются Property/Invoke Nodes и следовательно эти SubVI запускаются в UI-потоке?Kosist писал(а):Тогда проперти ноды вообще не будут нужны...
-
- professor
- Сообщения: 3409
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Задизейблить много кнопок за раз
во внутреннем цикле незачем перебирать все значения, лучше остановиться, как только искомая строка найдена.dadreamer писал(а): Enable-Disable Buttons.vi
С полгода назад возникла у меня задача в проекте реализовать некий внутренний поиск по большим объёмам данных. Например, есть массив кластеров [имя элемента - его параметры]. И мне нужен элемент определённого имени. Если в лоб, то это перебор в цикле, что довольно долго.
В том проекте данных довольно много, поэтому я остановился на варианте SQLite, живущего в памяти, но тогда же открыл для себя мощь типа Variant.
В нём есть неограниченное количество атрибутов любого типа, чем и можно лихо воспользоваться.
Почитав этот пост, озадачился тестом.
И вот что получается
сам исходник результат для 130 батонов.
variant имеет микроскопическое время доступа, никак не зависящее от индекса. В то же время, чем дольше от начала массива элемент, тем дольше его поиск. тогда стало любопытно, если элементов сотни (в этом тесте 800)?
но т.к. доступ к свойствам контролов жрёт гигантское количество ресурсов я задал разное количество повторов. Итог: время доступа к свойствам variant не зависит от количества этих свойств, а вот при переборе зависимость очевидна.
Не спорю, пример экзотический, 800 контролов вряд ли кто-то размещает (хотя, сколько кнопок-труб-цифровых индикаторов было в том проекте на каждом экране, я не считал). Да и при переборе через свойство больше ресурсов уходит на получение самого ресурса, чем на сравнение, но всё же.
И если уж тестировать, то до конца.
Вот тесты, не зависящие от доступа к UI. В массиве 1000 элементов. поиск последних на 3 порядка дольше, чем извлечение оных из Variant
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Задизейблить много кнопок за раз
Да, согласен. Но лень исправлять пост.Artem.spb писал(а):во внутреннем цикле незачем перебирать все значения, лучше остановиться, как только искомая строка найдена.
Всё это, конечно, интересно. Я часто использую вариант для работы с контролами и индикаторами. В реальной программе можно не перебирать элементы панели каждый раз - можно единожды получить имена (лэйблы), рефы и индексы и загнать эту инфу в вариант (пара "имя - реф", пара "имя - индекс"). Дальше вариант разослать по определённым SubVI. Нужно что-то сделать с элементом - сразу берём из варианта реф или индекс и используем. Вся работа с Property и Invoke - в цикле UI, работа по индексам - хоть где.
В принципе, хранение инфы в атрибутах варианта - решение далеко не новое. По ссылкам можно найти объяснения, почему этот подход быстрее традиционных.
https://forums.ni.com/t5/LabVIEW-Develo ... -p/3478922
ftp://ftp.ni.com/pub/events/webcasts/va ... _table.pdf
- Juri
- I/O
- Сообщения: 263
- Зарегистрирован: 19 апр 2017, 23:06
- Версия LabVIEW: 2021
- Благодарил (а): 13 раз
- Поблагодарили: 6 раз
Re: Задизейблить много кнопок за раз
а я блин значит изобрел свою vi, которая делает тоже самое, а тут понимаешь уже есть TRef Get All FP References.vi. и даже тулкитов ставить не надо. Мир так жесток!dadreamer писал(а):
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Задизейблить много кнопок за раз
Usss, есть ещё и его "собрат", который выполняет почти то же самое: http://www.labviewportal.org/viewtopic. ... 648#p63648 Однако, после его использования нужно закрывать референсы.
-
- leader
- Сообщения: 932
- Зарегистрирован: 17 янв 2016, 15:02
- Награды: 1
- Версия LabVIEW: 6.1,8.5,20
Re: Задизейблить много кнопок за раз
Полезная инструкция с примерами:
Obtaining References to Objects in an Unknown Target VI Using VI Scripting
http://zone.ni.com/reference/en-XX/help ... eferences/
Obtaining References to Objects in an Unknown Target VI Using VI Scripting
http://zone.ni.com/reference/en-XX/help ... eferences/
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Задизейблить много кнопок за раз
Да, но с точки зрения кода решение более гибкое, т.к. если в коде вызывать функции тулкита, и применять к интерфейсу определенный стейт, то определение состояния контролов/индикаторов можно изменять, не меняя кода. Т.е. тулкит считывает конфигурацию с xml файла - а его можно менять отдельно от кода, что есть плюс (как по мне).dadreamer писал(а):Но ведь внутри тулкита по-прежнему вызываются Property/Invoke Nodes и следовательно эти SubVI запускаются в UI-потоке?Kosist писал(а):Тогда проперти ноды вообще не будут нужны...
Плюс ко всему, тулкит использует плагины для применения состояния - плагин для текста Caption, плагин для Disable/Enable State, для цвета контролов, и т.д. И можно добавлять в xml файл дополнительные плагины, не изменяя код.
Да и в целом, код чище; плюс не нужно изобретать велосипед с обработкой всех ссылок контролов/индикаторов - все уже написано )))
Один минус - тулкит работает для версии > 2016...
Мы делили апельсин - много наших полегло...