синхронизация на старте (UE)

Общие принципы, проектирование, модуляризация, темплейты и шаблоны
Ответить
Artem.spb

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

синхронизация на старте (UE)

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

Нелюбители UE могут закидать помидорами, но вопрос не о том, что круче и удобнее, а о том, как сделать синхронизацию удобнее.
Вот абстрактный проект. Всё взаимодействие на событиях
init3.png
init3.png (6.96 КБ) 338 просмотров
Сначала делаю модуль (зелёный), у него свои компоненты. Их надо синхронизировать на старте.
Дальше этот модуль становится частью другого модуля (бордовый), там свой набор частей.
Ну и дальше можно слои наращивать (в теории бесконечно).
И тут возникает гонка вооружений состояний по принципу "кто первый встал, того и тапки". Верхний слой может скомандовать что-то нижним уровням ещё до того, как они зарегистрировали отслеживание события. Ждать по 10 сек на старте, чтобы "уж точно все" - не вариант. Вариант, конечно, но очень кривой.
Отправлять снизу сообщение "я готов" - тоже так себе затея, потому что хочется уйти от жестких завязок на количество компонентов, иначе на каждом уровне надо собрать информацию о готовности нижних, и только потом сообщать выше, что все готовы. Тем более, что тут та же проблема - нижний может сообщить о готовности до того, как верхний сам будет готов.

Я пока придумал только такой вариант через рандеву
Есть саб, создающий рандеву. У него на входе - количество компонентов. На каждом уровне модульности ожидания вызываю эту функцию, а только потом делаю всё остальное. Если ссылка уже есть, размер рандеву уменьшаться не будет
init1.png
init1.png (14.79 КБ) 338 просмотров
И есть вторая (клонова) функция, которая ждёт, когда все придут на свидание.
init2.png
init2.png (14.8 КБ) 338 просмотров
В проекте это выглядит примерно так
init4.png
init4.png (11.58 КБ) 338 просмотров
13 кусков кода должны дождаться общего старта. Справа сверху - функция ожидания синхронизации.
Справа снизу - модуль, в котором история повторяется, там 12 частей, из которых некоторые на ещё более глубоком уровне.
init5.png
В целом всё норм кроме одного. Если добавляю на какой-то уровень новый компонент, нужно прибавить 1 к числу на каждом уровне выше. Т.е. это ручная работа, которая может создать проблему, оосбоенно, если над проектом работает несколько человек. Один что-то прибавил, второй об этом не узнал. В итоге часть сообщений пролетела мимо.
Думал, можно узнать в системе количество клонов функции, но нет, такой радостной информации не нашёл.
Может, у кого етсь идею более удачного решения этой задачи?

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

Activity Professionalism Автор
professor
professor
Сообщения: 3508
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Репутация: 0
Версия LabVIEW: 2.5 — 2020
Контактная информация:

Re: синхронизация на старте (UE)

Сообщение dadreamer »

Тоже, не мудрствуя лукаво, использую рандеву, если надо несколько потоков синхронизировать, или порой ещё проще: создаю логическую очередь, подчинённые циклы по готовности помещают элемент в очередь, в главном цикле считаю кол-во элементов в ней. Конечно, не элегантно и завязано на hard-coded константу. Но особо думать бывает некогда. А так, тоже интересно послушать, у кого какие решения по синхронизации.

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

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

Re: синхронизация на старте (UE)

Сообщение taras_33 »

Отправлять снизу сообщение "я готов" - тоже так себе затея, потому что хочется уйти от жестких завязок на количество компонентов, иначе на каждом уровне надо собрать информацию о готовности нижних, и только потом сообщать выше, что все готовы. Тем более, что тут та же проблема - нижний может сообщить о готовности до того, как верхний сам будет готов.
Достаточно часто применяю эту модель, когда использую AF. Все модули (Actors) наследуются от родителя, в котором переопределяется метод Pre Launch Init, где инициализируются UE
Pre Launch Init.PNG
Pre Launch Init.PNG (4.91 КБ) 293 просмотра
Главный контроллер запуская модули, ждет от них ответа о успешных инициализации и запуске. Ответ содержит ID модуля, enqueuer и reference его фронтальной панели, если это необходимо конечно. В случае с UI reference нужен.
Notify.PNG
Notify.PNG (4.96 КБ) 293 просмотра
После получения необходимых ответов, контроллер показывает FP, которая при запуске скрыта.
UI.PNG
UI.PNG (10.96 КБ) 293 просмотра
кроме того посылается сообцение модулю, где генерируется UE с неоходимым временем цикла. Цикл начитает "крутится"
Generate UE.PNG
Generate UE.PNG (1.38 КБ) 293 просмотра
При добавлении/удалении модуля достаточно обновить typedef Actor ID, по количеству элементов которого определяется необходимое количество ожидаемых ответов.
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
Сообщения: 1967
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Репутация: 0
Версия LabVIEW: 12-18
Контактная информация:

Re: синхронизация на старте (UE)

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

taras_33 писал(а):
16 июл 2020, 05:53
где инициализируются UE
Инициализировать не достаточно, надо их зарегистрировать. У вас не нашёл отправки сообщения ПОСЛЕ регистрации событий, которые созданы в Pre

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

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

Re: синхронизация на старте (UE)

Сообщение IvanLis »

taras_33 писал(а):
16 июл 2020, 05:53
Ответ содержит ID модуля, enqueuer и ...
Я примерно так тоже делаю, но это не универсальный вариант, о котором был вопрос.
Т.к. в TypeDef жесткая привязка, что бы идентифицировать Actor, от которого получено подтверждение.

Я только в цикле, например с таймингом (например) 100мс делаю проверку, что все Actor прислали подтверждение, а потом уже иду дальше...
Снимок экрана от 2020-07-16 12-15-50.png
Вот например, ожидание ответа от встраиваемых панелей, но это все "жесткое" решение.

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

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

Re: синхронизация на старте (UE)

Сообщение taras_33 »

Инициализировать не достаточно, надо их зарегистрировать
Так они и регистрируются, когда актор запускается.
Как я писал в предыдущем посте, после получения ответа, сравнивается количество ответов с количеством всех акторов и если оно равно (все запустились), то посылаем каждому сообщение о запуске UI. Получив этот message, актор генерирует UE, устанавливая вместо -1 тайм-аут в while loop UI. Вот упрощённый вариант
Start.PNG
Соглашусь что привязка есть, но не такая уж и жёсткая. Изменил typedef, какие их ID, имеют ли они UI, без разницы , главное количество. Но повторюсь, это простой случай.
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!

Ответить

Вернуться в «Модели программирования»