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

Создание многооконного приложения с reentatn execution VI

Добавлено: 03 янв 2020, 12:08
dakishi
Я хочу создать многооконное приложение с помощью subVI работающих в режиме Shared clone reentatn execution, где по N моим кликам на кнопку вызова выплывает N одинаковых окон моих клонированных subVI которые работают одновременно. При этом я могу закрыть любое из окон и вызвать опять еще одно.

Я остановился на проблеме: я могу сделать только фиксированное число окон и потом их все закрыть, т.к. при входе на n-ю итерацию некого цикла, моя программа, допустим, когда видит N` SubVI, запускает их одновременно и ждет их выполнения, соответственно, я не могу добавить новое окно (только закрыть старые). Как можно обойти это ?

Re: Создание многооконного приложения с reentatn execution V

Добавлено: 04 янв 2020, 14:20
dadreamer
Посмотрите пример https://forums.ni.com/t5/LabVIEW/progra ... 39#M864196 Можно запустить сколько угодно окон и как угодно их закрыть. При этом основная программа не ждёт завершения работы SubVI (флаг 0x80 "Prepare to call and forget").

Re: Создание многооконного приложения с reentatn execution V

Добавлено: 04 янв 2020, 20:23
dakishi
[quote=="dadreamer"]Посмотрите пример https://forums.ni.com/t5/LabVIEW/progra ... 39#M864196 Можно запустить сколько угодно окон и как угодно их закрыть. При этом основная программа не ждёт завершения работы SubVI (флаг 0x80 "Prepare to call and forget").[/quote]

Не до конца понимаю, как это работает. Можете пояснить, что я делаю не так - здесь я убрал user events и оставил только открытие и закрытие ссылки на прибор. Но, выплывает ошибка LabVIEW: (Hex 0x407) VI Reference type does not match VI connector pane. При этом у моего subVI нет входов и выходов, но в ссылке требуется VI, так понимаю, как минимум с одним входом.
Также не совсем понимаю, как задается reentatn execution. На втором изображении приведен скрин примера оригинала.

Re: Создание многооконного приложения с reentatn execution V

Добавлено: 04 янв 2020, 20:45
dadreamer
>> ошибка LabVIEW: (Hex 0x407) VI Reference type does not match VI connector pane.
Надо обновить все константы-ссылки (VI References). Для первой: ПКМ -> Browse for Path -> указываете свой SubVI. Для второй: ПКМ -> Select VI Server Class -> Browse -> указываете свой SubVI.

>> Также не совсем понимаю, как задается reentatn execution.
Задано в настройках SubVI.
2020-01-04_22-41-07.jpg
Однако я ещё бы добавил флаг 0x40 "Enable simultaneous calls on reentrant VIs", т.к. без него несколько одновременно работающих SubVI выполняются последовательно. См. описание функции Open VI Reference.

>> здесь я убрал user events и оставил только открытие и закрытие ссылки на прибор
Верните Start Asynchronous Call Node, иначе чуда не произойдёт. Ну, то есть, ваш СабВИ не запустится.

Посмотрите также примеры в папке C:\Program Files\National Instruments\LabVIEW 2019\examples\Application Control\VI Server\Asynchronous Call By Reference.

Re: Создание многооконного приложения с reentatn execution V

Добавлено: 04 янв 2020, 22:13
dakishi
[quote=="dadreamer"]

>> Также не совсем понимаю, как задается reentatn execution.
Задано в настройках SubVI.
2020-01-04_22-41-07.jpg
Однако я ещё бы добавил флаг 0x40 "Enable simultaneous calls on reentrant VIs", т.к. без него несколько одновременно работающих SubVI выполняются последовательно. См. описание функции Open VI Reference.

[/quote]

Спасибо большое! Можете сказать, если я выберу в Property Node у ссылки Execution => Is reentatn - это то же самое, что и в VI properties (кроме настроек распределения памяти) ? И, можете сказать, какой опцией можно закрыть VI после выполнения - либо внутри VI, либо через здесь, из ведущего меню ? Последний вопрос - окошко у меня появляется в правом нижнем углу экрана, его не видно если не перетащить - как можно задать его положения ?

Re: Создание многооконного приложения с reentatn execution V

Добавлено: 05 янв 2020, 00:27
dadreamer
>> если я выберу в Property Node у ссылки Execution => Is reentatn - это то же самое, что и в VI properties (кроме настроек распределения памяти) ?
Да, с помощью свойства можно узнать, что VI реентерантный. Однако в RTE это свойство только для чтения. Записать можно, когда VI не запущен.

>> какой опцией можно закрыть VI после выполнения - либо внутри VI, либо через здесь, из ведущего меню ?
В примере с форума NI все подприборы завершают работу, когда пользовательское событие Custom User Event становится True. Вполне себе нормальный вариант. Можно и логический Notifier использовать при желании. Хотя в данном случае User Event удобнее, т.к. в каждом SubVI уже размещена Event-структура.

>> как можно задать его положения ?
Самое простое - установить Position = Centered в свойствах VI (вкладка Window Run-Time Position).

Re: Создание многооконного приложения с reentatn execution V

Добавлено: 20 янв 2020, 15:28
Juri
никогда не понимал, почему NI сделал такой неудобный вход в "Open VI Reference"