Задизейблить много кнопок за раз

Простейшие вопросы в области инженерной разработки
Ответить
TeaPot
interested
interested
Сообщения: 9
Зарегистрирован: 24 окт 2016, 17:05
Версия LabVIEW: 2015
Контактная информация:

Задизейблить много кнопок за раз

Сообщение TeaPot »

Привет.
Такой вопрос: Нужно в определенный момент работы программы задизейблить много разных кнопок и панелей. Я делаю это созданием Property Node-ов, но беда в том, что это занимает огромный объем в программе (Понимаю, что она резиновая, но не эстетично). Сделать SubVI тоже не вариант, т.к. все эти ноды принимаются подпрограммой на входе, потому места занимает не меньше. Можно ли как-то решить проблему с этим?
Заранее спасибо.
Аватара пользователя
dadreamer

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

Re: Задизейблить много кнопок за раз

Сообщение dadreamer »

 
Вложения
Enable-Disable Buttons.vi
lv2015
(12.73 КБ) 127 скачиваний
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Задизейблить много кнопок за раз

Сообщение Kosist »

В :labview: 2016 и выше можно использовать вот этот тулкит - https://forums.ni.com/t5/UI-Interest-Gr ... -p/3539490. Тогда проперти ноды вообще не будут нужны...
Мы делили апельсин - много наших полегло...
Аватара пользователя
dadreamer

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

Re: Задизейблить много кнопок за раз

Сообщение dadreamer »

Kosist писал(а):Тогда проперти ноды вообще не будут нужны...
Но ведь внутри тулкита по-прежнему вызываются Property/Invoke Nodes и следовательно эти SubVI запускаются в UI-потоке?
Artem.spb

Activity Автор
professor
professor
Сообщения: 3391
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: Задизейблить много кнопок за раз

Сообщение Artem.spb »

dadreamer писал(а):  Enable-Disable Buttons.vi
во внутреннем цикле незачем перебирать все значения, лучше остановиться, как только искомая строка найдена.

С полгода назад возникла у меня задача в проекте реализовать некий внутренний поиск по большим объёмам данных. Например, есть массив кластеров [имя элемента - его параметры]. И мне нужен элемент определённого имени. Если в лоб, то это перебор в цикле, что довольно долго.
В том проекте данных довольно много, поэтому я остановился на варианте SQLite, живущего в памяти, но тогда же открыл для себя мощь типа Variant.
В нём есть неограниченное количество атрибутов любого типа, чем и можно лихо воспользоваться.
Почитав этот пост, озадачился тестом.
И вот что получается
сам исходник
search test.png
результат для 130 батонов.
variant имеет микроскопическое время доступа, никак не зависящее от индекса. В то же время, чем дольше от начала массива элемент, тем дольше его поиск.
result.png
тогда стало любопытно, если элементов сотни (в этом тесте 800)?
но т.к. доступ к свойствам контролов жрёт гигантское количество ресурсов я задал разное количество повторов.
search test2.png
result800.png
Итог: время доступа к свойствам variant не зависит от количества этих свойств, а вот при переборе зависимость очевидна.

Не спорю, пример экзотический, 800 контролов вряд ли кто-то размещает (хотя, сколько кнопок-труб-цифровых индикаторов было в том проекте на каждом экране, я не считал). Да и при переборе через свойство больше ресурсов уходит на получение самого ресурса, чем на сравнение, но всё же.

И если уж тестировать, то до конца.
Вот тесты, не зависящие от доступа к UI. В массиве 1000 элементов. поиск последних на 3 порядка дольше, чем извлечение оных из Variant
clustertest.png
clustertestres.png
Аватара пользователя
dadreamer

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

Re: Задизейблить много кнопок за раз

Сообщение dadreamer »

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
I/O
Сообщения: 263
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Re: Задизейблить много кнопок за раз

Сообщение Juri »

dadreamer писал(а): 
а я блин значит изобрел свою vi, которая делает тоже самое, а тут понимаешь уже есть TRef Get All FP References.vi. и даже тулкитов ставить не надо. Мир так жесток!
Аватара пользователя
dadreamer

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

Re: Задизейблить много кнопок за раз

Сообщение dadreamer »

Usss, есть ещё и его "собрат", который выполняет почти то же самое: http://www.labviewportal.org/viewtopic. ... 648#p63648 Однако, после его использования нужно закрывать референсы.
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: Задизейблить много кнопок за раз

Сообщение Blackman »

Полезная инструкция с примерами:
Obtaining References to Objects in an Unknown Target VI Using VI Scripting
http://zone.ni.com/reference/en-XX/help ... eferences/
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Задизейблить много кнопок за раз

Сообщение Kosist »

dadreamer писал(а):
Kosist писал(а):Тогда проперти ноды вообще не будут нужны...
Но ведь внутри тулкита по-прежнему вызываются Property/Invoke Nodes и следовательно эти SubVI запускаются в UI-потоке?
Да, но с точки зрения кода решение более гибкое, т.к. если в коде вызывать функции тулкита, и применять к интерфейсу определенный стейт, то определение состояния контролов/индикаторов можно изменять, не меняя кода. Т.е. тулкит считывает конфигурацию с xml файла - а его можно менять отдельно от кода, что есть плюс (как по мне).
Плюс ко всему, тулкит использует плагины для применения состояния - плагин для текста Caption, плагин для Disable/Enable State, для цвета контролов, и т.д. И можно добавлять в xml файл дополнительные плагины, не изменяя код.
Да и в целом, код чище; плюс не нужно изобретать велосипед с обработкой всех ссылок контролов/индикаторов - все уже написано )))
Один минус - тулкит работает для версии > :labview: 2016...
Мы делили апельсин - много наших полегло...
Ответить

Вернуться в «Для чайников»