Зависание порта, что приводит к сбою работы всего приложения

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

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

Re: Зависание порта, что приводит к сбою работы всего прилож

Сообщение dadreamer »

AlexanderKonoval писал(а):И сам код SubVI довольно большой, его вставить в другую :vi: весьма проблематично.
Ничто не мешает поместить код в SubVI и разместить её на БД основной программы, организовав обмен через очереди и нотифайеры.
AlexanderKonoval писал(а):сработает ли, если на выходе из цикла :vi: верхнего уровня использую Invoke Node - Control Value - Set, и задам значение кнопки Stop = True для SubVI? Это не одно и то же, что Abort VI?
Возможно, что и сработает, если уберёте метод Abort VI. Но ситуация с наложением потоков останется, в результате может появиться коллизия, когда один SubVI запущен и в этот момент запускается ещё один. Если DLL не потокобезопасна, то вероятен крах программы или разного рода эксцессы.

Я предлагаю изменить архитектуру программы и сделать несколько параллельных циклов, часть из которых можно поместить в подприборы. Обмен данными между ними будет через очереди. Остановка циклов производится через Notifier = True. Коллизий не возникнет, т.к. каждый цикл - один поток, а вызовы из библиотеки корректно отработают, т.к. :labview: будет ждать завершения выполнения всех :vi: . Вот примерчик, можете его менять, как угодно.
Вложения
SubVI.vi
lv2013
(22.23 КБ) 175 скачиваний
Main.vi
lv2013
(20.19 КБ) 159 скачиваний
AlexanderKonoval
developer
developer
Сообщения: 257
Зарегистрирован: 03 янв 2014, 19:37
Версия LabVIEW: 2016
Откуда: Украина, Киев
Контактная информация:

Re: Зависание порта, что приводит к сбою работы всего прилож

Сообщение AlexanderKonoval »

Vitekkz88 писал(а): Прислушайтесь к совету dadreamer-а по поводу остановки приложения. Notifier идеально для этого подходит. Я даже самые простые приложения с парочкой потоков завершаю с использованием Notifier. Любопытно, а subVI внутри имеют структуры с циклами?А потом еще в основной vi тоже в цикл ставятся? :wink:
Да, я об этом писал. SubVI циклично опрашивает устройство, :vi: верхнего уровня принимает данные также в цикле. Код обеих :vi: довольно путанный и его много, в связи с чем не шибко представляется возможным поместить их в рамки одной :vi: , а, как я понимаю, Notifier используется как раз в рамках одной :vi: ? Я к изучению Notifier не подходил ещё, по сути, нужды не было.
колдооооовствооооо! (С)
Аватара пользователя
dadreamer

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

Re: Зависание порта, что приводит к сбою работы всего прилож

Сообщение dadreamer »

AlexanderKonoval, можно создать сколь угодно много нотифайеров в рамках одной программы и на кажду пару циклов определить свой нотифайер. Главное потом не запутаться в коде.
AlexanderKonoval
developer
developer
Сообщения: 257
Зарегистрирован: 03 янв 2014, 19:37
Версия LabVIEW: 2016
Откуда: Украина, Киев
Контактная информация:

Re: Зависание порта, что приводит к сбою работы всего прилож

Сообщение AlexanderKonoval »

dadreamer, спасибо большое, буду разбираться. С очередями ещё вообще не знаком, так что надо будет пораскинуть мозгами, каким именно образом их прикручивать к тому, что уже есть
колдооооовствооооо! (С)
Аватара пользователя
Vitekkz88

Activity Silver Автор
expert
expert
Сообщения: 1100
Зарегистрирован: 21 янв 2014, 15:45
Награды: 3
Версия LabVIEW: 12,13,14
Откуда: Томск
Контактная информация:

Re: Зависание порта, что приводит к сбою работы всего прилож

Сообщение Vitekkz88 »

С очередями ещё вообще не знаком, так что надо будет пораскинуть мозгами, каким именно образом их прикручивать к тому, что уже есть
Вам предстоит целая эпопея по переделке своего приложения.
Возможно Вы уже вкурсе,но я всё-таки скажу: LabVIEW - это многопоточная среда программирования. Каждый while loop - это отдельный поток. Много отдельных циклов - много отдельных потоков.
Элементы многопоточного программирования : очереди, уведомители, семафоры.
Эти элементы актуальны и в С++ и в других языках текстового программирования.
Одной из самых сильных сторон LabVIEW как раз и является относительно простая разработка многопоточных программ. А возможности встраивать dll-библиотеки,разработанные на C/C++(к примеру) - делают программы достаточно "шустрыми". Но есть и минусы,не обольщайтесь :crazy: Как говорится - всё зависит от задачи:)
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
AlexanderKonoval
developer
developer
Сообщения: 257
Зарегистрирован: 03 янв 2014, 19:37
Версия LabVIEW: 2016
Откуда: Украина, Киев
Контактная информация:

Re: Зависание порта, что приводит к сбою работы всего прилож

Сообщение AlexanderKonoval »

dadreamer, громадное спасибо за ваши примеры! сегодня только появилась возможность - сделал, всё работает на ура.
колдооооовствооооо! (С)
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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