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

Простейшие вопросы в области инженерной разработки

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

Postby TeaPot on 08 Sep 2017, 15:20

Привет.
Такой вопрос: Нужно в определенный момент работы программы задизейблить много разных кнопок и панелей. Я делаю это созданием Property Node-ов, но беда в том, что это занимает огромный объем в программе (Понимаю, что она резиновая, но не эстетично). Сделать SubVI тоже не вариант, т.к. все эти ноды принимаются подпрограммой на входе, потому места занимает не меньше. Можно ли как-то решить проблему с этим?
Заранее спасибо.
TeaPot
interested
interested
 
Posts: 8
Joined: 24 Oct 2016, 17:05
LabVIEW Version: 2015
Karma: 0

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

Postby dadreamer on 08 Sep 2017, 16:07

 
Attachments
Enable-Disable Buttons.vi
lv2015
(12.73 KiB) Downloaded 33 times
User avatar
dadreamer
doctor
doctor
 
Posts: 2844
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 701
I/O VIP vision internet

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

Postby Kosist on 09 Sep 2017, 09:38

В :labview: 2016 и выше можно использовать вот этот тулкит - https://forums.ni.com/t5/UI-Interest-Gr ... -p/3539490. Тогда проперти ноды вообще не будут нужны...
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 760
Joined: 21 Feb 2011, 23:44
Location: СумГУ
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 224
CLAD I/O VIP students

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

Postby dadreamer on 09 Sep 2017, 13:08

Kosist wrote:Тогда проперти ноды вообще не будут нужны...

Но ведь внутри тулкита по-прежнему вызываются Property/Invoke Nodes и следовательно эти SubVI запускаются в UI-потоке?
User avatar
dadreamer
doctor
doctor
 
Posts: 2844
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 701
I/O VIP vision internet

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

Postby Artem.spb on 09 Sep 2017, 23:29

dadreamer wrote:  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
Artem.spb
expert
expert
 
Posts: 1195
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 213
CLD hardware I/O VIP freelance

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

Postby dadreamer on 09 Sep 2017, 23:46

Artem.spb wrote:во внутреннем цикле незачем перебирать все значения, лучше остановиться, как только искомая строка найдена.

Да, согласен. Но лень исправлять пост.

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

В принципе, хранение инфы в атрибутах варианта - решение далеко не новое. По ссылкам можно найти объяснения, почему этот подход быстрее традиционных.
https://forums.ni.com/t5/LabVIEW-Develo ... -p/3478922
ftp://ftp.ni.com/pub/events/webcasts/va ... _table.pdf
User avatar
dadreamer
doctor
doctor
 
Posts: 2844
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 701
I/O VIP vision internet

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

Postby Usss on 11 Sep 2017, 10:16

dadreamer wrote: 

а я блин значит изобрел свою vi, которая делает тоже самое, а тут понимаешь уже есть TRef Get All FP References.vi. и даже тулкитов ставить не надо. Мир так жесток!
Usss
beginner
beginner
 
Posts: 36
Joined: 19 Apr 2017, 23:06
LabVIEW Version: 2015
Karma: 10

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

Postby dadreamer on 11 Sep 2017, 11:53

Usss, есть ещё и его "собрат", который выполняет почти то же самое: viewtopic.php?p=63648#p63648 Однако, после его использования нужно закрывать референсы.
User avatar
dadreamer
doctor
doctor
 
Posts: 2844
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 701
I/O VIP vision internet

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

Postby Blackman on 11 Sep 2017, 13:40

Полезная инструкция с примерами:
Obtaining References to Objects in an Unknown Target VI Using VI Scripting
http://zone.ni.com/reference/en-XX/help ... eferences/
Blackman
leader
leader
 
Posts: 658
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 166

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

Postby Kosist on 13 Sep 2017, 22:07

dadreamer wrote:
Kosist wrote:Тогда проперти ноды вообще не будут нужны...

Но ведь внутри тулкита по-прежнему вызываются Property/Invoke Nodes и следовательно эти SubVI запускаются в UI-потоке?

Да, но с точки зрения кода решение более гибкое, т.к. если в коде вызывать функции тулкита, и применять к интерфейсу определенный стейт, то определение состояния контролов/индикаторов можно изменять, не меняя кода. Т.е. тулкит считывает конфигурацию с xml файла - а его можно менять отдельно от кода, что есть плюс (как по мне).
Плюс ко всему, тулкит использует плагины для применения состояния - плагин для текста Caption, плагин для Disable/Enable State, для цвета контролов, и т.д. И можно добавлять в xml файл дополнительные плагины, не изменяя код.
Да и в целом, код чище; плюс не нужно изобретать велосипед с обработкой всех ссылок контролов/индикаторов - все уже написано )))
Один минус - тулкит работает для версии > :labview: 2016...
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 760
Joined: 21 Feb 2011, 23:44
Location: СумГУ
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 224
CLAD I/O VIP students


Return to Для чайников

Who is online

Users browsing this forum: Et_cetera and 21 guests

cron