Куда уходит фокус

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
Ответить
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 342
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Репутация: 0
Версия LabVIEW: 2019
Контактная информация:

Куда уходит фокус

Сообщение taras_33 »

Окно главной программы, с несколькими SubPanel, при запуске вставляет в свои субпанели FB приборов, в данном конкретном случае различные Power Supplies. Фронтальные Панели этих Power Supplies представляют собой Cluster с контролами. Первоначально этот сluster disabled & grayed. Далее, главная программа проверяет присуствие в системе этих самих блоков (GPIB) и в случае обнаружения, инициализирует найденый блок питания и делает доступным его управление -> Enable Cluster. Все замечательно работает. Каждые две секунды главная программа обнюхивает VISA Resourses на предмет изменений. В случае обнаружения, повторяет выше описанную процедуру, в случае выключения наоборот disabled & grayed его панель. Физически это выглятит так: Юзер запустил программу, включил нужный в данный момент блок питания, окно активизировалось, делай что нужно, (либо наоборот, включил блок, потом запустил программу). Остальные отаются неактивированы. Выключил Блок, его панель тут же деактивировалась...
Воот.
А теперь проблема: обычный numeric control, расположеный на фронтальной панели, теряет фокус.
Значит я кликаю на numeric control, появляется мигающий курсор и только я собрался ввести что то с клавиатуры, а фокуса уже и нет...
Перелопатил форумы, нашел что у народа теряется фокус, если обновлять свойства, типа Tip Strip property, в других панелях, но я то ничего не обновляю, у меня вообще панель не инициализирована и выключена. Я только посылаю сообщение actor, мол посмотри не появилось что то в системе с твоим GPIB адресом, и если да, дай мне знать, я в курсе что делать дальше...
Если выключить опрос, все работает и фокус не уходит.
Уже "липкий пот, холодные конечности" .. Может кто подскажет, как побороть данную проблему, либо как отловить кто "ворует" фокус. Крайне не хочется NumPad лепить...
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!

Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
professor
professor
Сообщения: 4929
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Репутация: 0
Версия LabVIEW: 2015, 2016
Откуда: СССР

Re: Куда уходит фокус

Сообщение IvanLis »

А если перед началом "проверки" узнать на каком элементе установлен фокус, а по окончании его туда принудительно установить (вернуть)?

Artem.spb

Activity Автор
expert
expert
Сообщения: 1934
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Репутация: 0
Версия LabVIEW: 12-18
Контактная информация:

Re: Куда уходит фокус

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

taras_33 писал(а):
30 апр 2020, 02:51
у меня вообще панель не инициализирована и выключена.
не понял, как фокус убегает, если панель выключена?

У меня была похожая проблема, когда фокус не хотел ставиться. Приходилось ставить фокус, менять свойства контрола и снова ставить фокус. Только так соглашались работать. Если фокус ставил один раз в конце или начале действий, не работало

Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 342
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Репутация: 0
Версия LabVIEW: 2019
Контактная информация:

Re: Куда уходит фокус

Сообщение taras_33 »

IvanLis писал(а):
30 апр 2020, 12:32
А если перед началом "проверки" узнать на каком элементе установлен фокус, а по окончании его туда принудительно установить (вернуть)?
В смысле на каком? На том, на который я щелкнул. Фокус уходит в момент отправки сообщения actor с выключеной панелью, мол проверь вдруг может чего появилось в системе... Игры с property Is Frontmost успеха не принесли. Смысл происходящего до конца мной не понят и пока остановился на временном решении - в момент щелчка mouse down выключаю опрос, а уже после mouse leave востанавливаю его обратно. Все работает. Решение не лучшее и смахивает на костыль, что произойдет, если юрер щелкнул на контроле, опрос выключился, мышь остаётся в этом положении и событие mouse leave не происходит и опрос обратно не включается. Придется городить какой нибудь таймер, который по истечении определенного времени, если юзер не предпринимал никаких действий, включать опрос принудительно обратно. Вообщем буду копать дальше.. ​
Последний раз редактировалось taras_33 30 апр 2020, 16:12, всего редактировалось 2 раза.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!

Artem.spb

Activity Автор
expert
expert
Сообщения: 1934
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Репутация: 0
Версия LabVIEW: 12-18
Контактная информация:

Re: Куда уходит фокус

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

taras_33 писал(а):
30 апр 2020, 15:35
Фокус уходит в момент отправки сообщения actor с выключеной панелью,
любого сообщения, или того, которое дёргает панель?
Если вызвать что-то бездействующее?

Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 342
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Репутация: 0
Версия LabVIEW: 2019
Контактная информация:

Re: Куда уходит фокус

Сообщение taras_33 »

В том-то и дело что панель я не дёргаю. Отправляется единственное сообщение в котором происходит проверка, на предмет наличия конкретного GPIB адреса в системе (VISA Found Resources).
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!

Artem.spb

Activity Автор
expert
expert
Сообщения: 1934
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Репутация: 0
Версия LabVIEW: 12-18
Контактная информация:

Re: Куда уходит фокус

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

taras_33 писал(а):
30 апр 2020, 15:57
В том-то и дело что панель я не дёргаю. Отправляется единственное сообщение в котором происходит проверка, на предмет наличия конкретного GPIB адреса в системе (VISA Found Resources).

Ещё раз: что будет если вместо этого отправить запрос на ПУСТОЙ метод?

Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 342
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Репутация: 0
Версия LabVIEW: 2019
Контактная информация:

Re: Куда уходит фокус

Сообщение taras_33 »

С пустым методом тоже самое.

Чтобы было более понятно приложил структуру проекта.
Structure.png
Внизу четыре блока питания, будет добавлятся больше и представляют собой Actors с фронтальными панелями в виде кластеров. Enable/Disable & Grayed этих кластеров наглядно дает понять юзеру какие из блоков включены. Практический весь функционал блоков реализован в PS ROOT, от которого они наследуются.​ Выше Frame (голубенький) главная программа-контроллер, фронтальня панель которого состоит из субпанелей, в которые вставляются кластеры блоков и который управляет всем хозяйством. Контроллер периодически опрашивает блоки на предмет наличия их в системе (включены ли они - VISA Find Resources) Блоки отвечают контроллеру о статусе и контроллер базируясь на нем включает/выключает, инициализирует и т.д.

Скажем я работаю с одним блоком, остальные выключены. Хочу к примеру поменять угол сдвига между фазами, щелкаю на numeric, появляется курсор и тут же пропадает. Фокус уходит в момент отправки сообщения выключеным блокам, включенные не опрашиваются. Если блок выключить, то ошибка в коммуникации, отловиться, фронтальная панель - cluster Disable & Grayed, НО сам Actor продолжит работать и добавится в список опроса. Как то так.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!

Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1069
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Репутация: 0
Версия LabVIEW: 2013-2020
Контактная информация:

Re: Куда уходит фокус

Сообщение Kosist »

Есть еще пара тем с подобным вопросом, но без ответа -
https://forums.ni.com/t5/LabVIEW/quot-R ... d-p/195926
https://forums.ni.com/t5/LabVIEW/Focus- ... -p/3227967

А как именно отправляются те периодические сообщения? Delayed Message; или Timeout? событие в Event Structure; или что-то третье?
Мы делили апельсин - много наших полегло...

Blackman

Activity
leader
leader
Сообщения: 929
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Репутация: 0
Версия LabVIEW: 6.1,8.5,20
Контактная информация:

Re: Куда уходит фокус

Сообщение Blackman »

... еще пара тем с подобным вопросом, но без ответа...
Старые темы. Описание, обсуждение и пути решения проблемы здесь:

The UI Thread, Root Loop, and LabVIEW: What You Need to Know
https://www.winemantech.com/blog/the-ui ... d-to-know/

Run Method should not run in the user interface thread
https://forums.ni.com/t5/LabVIEW-Idea-E ... n#comments

Quick Tip: Asynchronously launching VIs the right way
https://labviewcoder.com/2016/07/06/qui ... right-way/

Asynchronous Calls in the Actor Framework
https://forums.ni.com/t5/Actor-Framewor ... -p/3867654

Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1069
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Репутация: 0
Версия LabVIEW: 2013-2020
Контактная информация:

Re: Куда уходит фокус

Сообщение Kosist »

Так а какие пути решения? Изменение запуска актора? В этих темах не затрагивается "перехват фокуса". Понятно что выполнение в одному UI Thread блокирует процессы, но означает ли это что изменяется и "фокус" окна?
Мы делили апельсин - много наших полегло...

Blackman

Activity
leader
leader
Сообщения: 929
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Репутация: 0
Версия LabVIEW: 6.1,8.5,20
Контактная информация:

Re: Куда уходит фокус

Сообщение Blackman »

AristosQueue
"You want to know why the Run method "Requires Root Loop" (that's the term from the code side of things). This is pretty straightforward to explain: The UI thread can do "cooperative multitasking", to allow many methods/properties to appear to run in parallel even though they all require the UI thread by giving each of them a little bit of time. But some operations, particularly those that affect multiple VIs simultaneously, cannot proceed together. Trying to process a Run command at the same time as scripting a Drop SubVI node would be particularly messy, just to pick one example. There are many operations that cannot do the cooperative multitasking because they affect so much system state, and Run is one of those methods. That's definitely not something that can change."
Другими словами для асинхронного запуска :vi: необходимо снять фокус, а иначе можно :suicide:

Ответить

Вернуться в «Коммуникация с приборами»