Страница 1 из 1

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

Добавлено: 30 апр 2020, 02:51
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 лепить...

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

Добавлено: 30 апр 2020, 12:32
IvanLis
А если перед началом "проверки" узнать на каком элементе установлен фокус, а по окончании его туда принудительно установить (вернуть)?

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

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

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

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

Добавлено: 30 апр 2020, 15:35
taras_33
IvanLis писал(а): 30 апр 2020, 12:32 А если перед началом "проверки" узнать на каком элементе установлен фокус, а по окончании его туда принудительно установить (вернуть)?
В смысле на каком? На том, на который я щелкнул. Фокус уходит в момент отправки сообщения actor с выключеной панелью, мол проверь вдруг может чего появилось в системе... Игры с property Is Frontmost успеха не принесли. Смысл происходящего до конца мной не понят и пока остановился на временном решении - в момент щелчка mouse down выключаю опрос, а уже после mouse leave востанавливаю его обратно. Все работает. Решение не лучшее и смахивает на костыль, что произойдет, если юрер щелкнул на контроле, опрос выключился, мышь остаётся в этом положении и событие mouse leave не происходит и опрос обратно не включается. Придется городить какой нибудь таймер, который по истечении определенного времени, если юзер не предпринимал никаких действий, включать опрос принудительно обратно. Вообщем буду копать дальше.. ​

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

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

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

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

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

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

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

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

Добавлено: 30 апр 2020, 17:07
taras_33
С пустым методом тоже самое.

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

Скажем я работаю с одним блоком, остальные выключены. Хочу к примеру поменять угол сдвига между фазами, щелкаю на numeric, появляется курсор и тут же пропадает. Фокус уходит в момент отправки сообщения выключеным блокам, включенные не опрашиваются. Если блок выключить, то ошибка в коммуникации, отловиться, фронтальная панель - cluster Disable & Grayed, НО сам Actor продолжит работать и добавится в список опроса. Как то так.

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

Добавлено: 02 май 2020, 01:36
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; или что-то третье?

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

Добавлено: 02 май 2020, 13:01
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

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

Добавлено: 03 май 2020, 14:40
Kosist
Так а какие пути решения? Изменение запуска актора? В этих темах не затрагивается "перехват фокуса". Понятно что выполнение в одному UI Thread блокирует процессы, но означает ли это что изменяется и "фокус" окна?

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

Добавлено: 03 май 2020, 15:25
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: