Actor Framework

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

Re: Actor Framework

Postby dadreamer on 27 Dec 2015, 14:57

taras_33, спасибо за развёрнутую инструкцию для чайников! :D Я с этим ни разу не работал, потому наверное тоже отношусь к ним. )

Ради интереса попробовал сделать всё вышеописанное в :labview: 2015. Подошла инструкция для :labview: 2014. Однако хотелось бы уточнить кое какие моменты:
1. При изменении наследственности Main FP.lvclass (Часть четвертая: Негоже быть беспризорным или удочерение класса (а может усыновление?)) в окне Change Inheritance изначально почему-то не было Actor.lvclass и вообще всего, что с ним связано. Был только Main FP.lvclass. Я сохранил весь проект, закрыл :labview: и открыл по-новой. Тогда Actor.lvclass появился.
2. В меню Tools не было пункта Actor Framework Message Maker (Часть седьмая: Метод класса и Message Maker). В таком случае его нужно ставить через VIPM: набрать в строке поиска "Actor" и появится пакет MGI Actor Framework Message Maker (v1.0.0.17 в моём случае).
3. При компиляции в экзешник не работает. Компилирую Launcher.vi. При запуске экзешника появляется этот самый лаунчер, но на этом всё. Связано это со входом Open Actor Core front panel? у Actor:Launch Root Actor VI:
LabVIEW Help wrote:The TRUE setting causes this VI to return an error in the run-time engine.

Советуют использовать метод Front Panel:Open. Поэтому я поместил в Actor Core.vi вот это:
2015-12-27_17-19-34.jpg
2015-12-27_17-19-34.jpg (19.88 KiB) Viewed 8170 times

Всё заработало. При желании можно и сам Launcher скрыть, вызвав FP.State = Hidden до запуска Root Actor'а.

Далее вопрос общего плана. Как понять, что уместнее использовать AF, а не стандартные шаблоны типа параллельных циклов? Субъективно кажется, что стандартный шаблон проще и быстрее создать, чем возиться с классами. Есть ли критерий, по которому можно понять, что лучше повозиться в начале, а потом "курить бамбук", чем наборот? :)
User avatar
dadreamer
professor
professor
 
Posts: 3310
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 844
I/O VIP vision internet

Re: Actor Framework

Postby taras_33 on 27 Dec 2015, 17:48

Все верно, в real time это не работает, я просто не думал что кто то начнет сразу компилировать. Нужно не только Open FP но еще и Close. Как то так

Open-Close FP.jpg


Я правда все эти дела оформляю в SubVI. Но здесь оставим как есть, для наглядности. Кроме того, что будет, если один из методов вернет ошибку?

Error.jpg


Все правильно, Actor вылетит с ошибкой, которую впрочем можно отловить, обработать и принять решение останавливать Actor, вызвавший ошибку или shutdown всю программу, а может просто проигнорировать и продолжать работу, как ни в чем не бывало. Но есть проблема, если Вы решаете остановить Actor, верхний while loop останется работать, он то об ошибке в “нижнем while loop” ни ухом ни рылом. Поэтому нужно добавить UE, которое пригодится не только в случае с ошибками, но и в случае, когда Вам нужно остановить Actor из другого Actor-a

UE.jpg


Вооот… А теперь представьте, что у Вас десяток Актеров c UI, и че для каждого создавать user event-ы? Нет конечно, нужно просто создать общего родителя и там сделать одну UE и пользоваться этим ивентом во всех детях (если нужно конечно) Другой пример, в своих проектах, каждый запускаемый actor TCP, UDP, Config и тд отчитывается главному, мол я такой то, запустился без ошибок.. Процесс запуска и инициализации я обычно показываю на splash screen, в виде progress bar, этот splash screen служит по совместительству Launcher-ом Главный - ага, все запустились? Молодцы! Можно показывать юзеру окно программы. Естественно этот отчет сделан в абстрактном классе (родителе), а не в каждом отдельном ребенке. И вообще используя OOP можно свести к минимуму дублирование кода, вот этим AF и пользуется. Actor это не просто параллельный цикл, это отдельный независимый модуль, который может жить независимо своей жизнью, принимать собственные решения, базируясь (или нет) на инструкциях “сверху” ООП достаточно большая тема выходящая за рамки этого форума. Следующий раз, когда меня посетит муза, (обычно с бодуна, а выпиваю я крайне редко) я добавлю к этому проектику, какой нибудь генератор чисел, который будет слать эти числа в главное окно программы.
Last edited by taras_33 on 27 Dec 2015, 23:38, edited 1 time in total.
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!
User avatar
taras_33
developer
developer
 
Posts: 292
Joined: 31 Oct 2009, 18:25
Location: Minsk -> Miami
Medals: 1
Activity (1)
LabVIEW Version: 2016
Karma: 131
CLD VIP

Re: Actor Framework

Postby taras_33 on 27 Dec 2015, 21:27

Часть десятая: Error Handle

Простейший пример обработки ошибки, а заодно научимся передавать информацию, в нашем случае это будет boolen.
Добавим на FP две кнопки, при нажатии на которые будем генерировать ошибки критическую и не очень :D
FP with error.jpg
FP with error.jpg (40.39 KiB) Viewed 8150 times

Создадим метод, при вызове которого будут генерироваться эти ошибки, причем если передаваемый параметр ‘true’ то ошибка будет критической, если ‘false’ то легкой.
ПКМ Main FP.lvclass -> New -> VI From Static Dispatch Template. Делаем блок диаграмму, похожую на эту
Custom Error.jpg

Сохраняем его под именем Custom Error, не забываем соединить Boolean input с коннектором
Connector.jpg

Далее повторяем шаги, описанные в седьмой части Tools –> Actor Framework Message Maker выделяем наш сохранённый метод Custom Error и генерируем Custom Error Msg.lvclass. Перетаскиваем его в виртуальную папку Messages for Main class.
Создаем два события по нажатию кнопок и перетаскиваем туда из окна проекта Send Custom Error.vi В в одном случае передаем True во втором False
Send error 1.jpg

Теперь повторяем шаги из пятой части, только сейчас выделяем Handle Error.vi, кликаем ок
Окно нашего проекта сейчас выглядит так
Project with Handle Error.jpg
Project with Handle Error.jpg (53.92 KiB) Viewed 8150 times


Открываем Handle error.vi и изменяем блок диаграмму
BD Handle Error.jpg


Все сохраняем, запускаем щелкаем по кнопкам, осмысливаем чего мы тут натворили

в приложении обновленный проект
Attachments
AF for Dummies.zip
(149.38 KiB) Downloaded 161 times
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!
User avatar
taras_33
developer
developer
 
Posts: 292
Joined: 31 Oct 2009, 18:25
Location: Minsk -> Miami
Medals: 1
Activity (1)
LabVIEW Version: 2016
Karma: 131
CLD VIP

Re: Actor Framework

Postby taras_33 on 18 Nov 2017, 04:32

Доброго всем времени суток господа девелоперы.
Что бы не плодить новые темы, решил продолжить в этой, потому предложеный мной проект использует все тот же Actor Framework. Практически все мои проекты используют эту замечательную библиотеку, как в явном виде, так и в скомпилированную в PPL
Ну о архитектуре plugin я уже упоминал в соответствующей теме и возможно в будущем я продемонстрирую какой нибудь пример. А сегодня хочу поделится демонстрационным проектом, цель которого ... показать как я завершаю выполнение программы. Например Ваша программа отслеживает и контролирует давление в какой то системе, было бы логично не просто завершить работу программы, но и перед этим произвести какие то действия: Закрыть открытые порты, установить в ноль блоки питания, открыть клапана - не оставлять же систему под давлением... Причем желательно наблюдать за процессом... И в случае если оператор женщина, иметь возможность передумать в самый последний момент....
Вообщем хватит демагогии. Разархивируем, открываем проект и запускаем Launcher. Тыкаем на кнопочки, оставляем коментарии.
Ах да, чуть не забыл - проект в LabVIEW 2016 с новой версией Actor Framework стало еще проще работать...
Attachments
TestShutDown Actor.zip
(658.01 KiB) Downloaded 87 times
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!
User avatar
taras_33
developer
developer
 
Posts: 292
Joined: 31 Oct 2009, 18:25
Location: Minsk -> Miami
Medals: 1
Activity (1)
LabVIEW Version: 2016
Karma: 131
CLD VIP

Re: Actor Framework

Postby Kosist on 18 Nov 2017, 23:16

Хороший пример, но в случае работы с Actor Framework часто стоит задача еще и отследить закрытие/порядок закрытия акторов при завершении приложения. Понятно, что в таком случае поможет Handle Last Ack.vi метод, но и его использование должно быть правильным, дабы не заблокировать систему в целом. Интересно, решаете ли Вы тоже и эту задачу в своих проектах? Если да, то как именно обрабатываете задержку закрытия, если актор не останавливается сразу? Такой пример тоже был бы полезен здесь, если у Вас есть такой в "загашнике" :wink:
А вообще, интересно сколько людей на портале сейчас использует AF в проектах? Или что-то подобное, типа JKI SMO?..
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 968
Joined: 21 Feb 2011, 23:44
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 270
CLAD I/O VIP students

Re: Actor Framework

Postby taras_33 on 19 Nov 2017, 01:53

Kosist wrote:Интересно, решаете ли Вы тоже и эту задачу в своих проектах? Если да, то как именно обрабатываете задержку закрытия, если актор не останавливается сразу? Такой пример тоже был бы полезен здесь, если у Вас есть такой в "загашнике"


Естественно! Куда же без Last Ask. В среднем проекте используется порядка 20 Actors. Одни работают постоянно, других запускает/останавливает пользователь - тыкая на кнопочки. Нужно же как то отслеживать весь этот "табун". Вот здесь незаменимым оказывается Last Ask. Вариантов множество, все зависит от структуры программы и поставленой задачи. В простейшем случае можно поступить так. После запуска Actor-a его Enqueuer добавляем в массив

Add to Actors Array.PNG
Add to Actors Array.PNG (2.89 KiB) Viewed 5652 times


При завершении программы, разослать всем stop-ы и отслеживать в Last Ask который из актеров завершил работу и удалить его enqueuer из массива, попутно показывая запуск/остановку в строке состояния... Ну и проверять масив. Если масив пустой - закрываем главное окно программы. Повторюсь это простейший случай. В реальных проектах немного все сложнее, но и надежнее.

Last Ask.PNG


Когда дело касается какой то модификации существующего рабочего проекта, то OOP и AF вне конкуренции. Быстрота что то добавить/удалить/изменить, не затрагивая остальной рабочий код вот основное достоинство "этой парочки" Мое мнение таково: что грамотная структура программы намного важнее, чем грамотно написанная функция. В последствии функцию (vi) можно быстро переделать, а вот изменить структуру всего проекта куда сложнее.
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!
User avatar
taras_33
developer
developer
 
Posts: 292
Joined: 31 Oct 2009, 18:25
Location: Minsk -> Miami
Medals: 1
Activity (1)
LabVIEW Version: 2016
Karma: 131
CLD VIP

Re: Actor Framework

Postby Aleksandr on 19 Nov 2017, 13:18

При запуске нэстедов с флагом "Auto-stop" не тоже ли самое происходит? Вы так дублируете встроенное решение.
Uniscan Research
Aleksandr
user
user
 
Posts: 97
Joined: 21 Jun 2011, 15:05
Location: Novosibirsk
Medals: 1
Gold (1)
LabVIEW Version: 2009-2017
Karma: 61
students

Re: Actor Framework

Postby Kosist on 19 Nov 2017, 15:00

Aleksandr wrote:При запуске нэстедов с флагом "Auto-stop" не тоже ли самое происходит? Вы так дублируете встроенное решение.

Не совсем. Вот текст из справки:
Auto-stop determines whether Nested Actor stops when the calling actor stops. The default value is TRUE. If you set the value of this input to FALSE, you must manually override the Stop Core VI on the caller actor to specify stop behavior for Nested Actor.

Т.е. если Вы остановили актор, который имеет nested actors, то тогда и они будут остановлены. Т.е. флаг "Auto-stop" помогает
остановить акторы. А если нужно вначале проконтроллировать их остановку, а уже потом остановку главного актора, то нужно использовать Handle Lask Ack.
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 968
Joined: 21 Feb 2011, 23:44
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 270
CLAD I/O VIP students

Re: Actor Framework

Postby Aleksandr on 19 Nov 2017, 17:29

Т.е. если Вы остановили актор, который имеет nested actors, то тогда и они будут остановлены. Т.е. флаг "Auto-stop" помогает
остановить акторы. А если нужно вначале проконтроллировать их остановку, а уже потом остановку главного актора, то нужно использовать Handle Lask Ack.

Ну так и используйте функцию "Read Autostop Nested Actor Count" в каждом "Handle Last Ack Core", не пойму чему противоречит.
Uniscan Research
Aleksandr
user
user
 
Posts: 97
Joined: 21 Jun 2011, 15:05
Location: Novosibirsk
Medals: 1
Gold (1)
LabVIEW Version: 2009-2017
Karma: 61
students

Re: Actor Framework

Postby Kosist on 19 Nov 2017, 19:23

Aleksandr wrote:Ну так и используйте функцию "Read Autostop Nested Actor Count" в каждом "Handle Last Ack Core", не пойму чему противоречит.

А где будет вызываться функция "Read Autostop Nested Actor Count"? Главный актор будет остановлен, а значит Nested Actor, после остановки, посылает Last Ack сообщение "в никуда" (ошибки не будет). Это в случае флага "Auto-stop".
В целом, смысл следующий. Если Вы желаете просто останавливать акторы, не заботясь о порядке остановки, и в целом "правильности" остановки модулей, то конечно, флаг "Auto-stop" то, что нужно. Я же имел ввиду "полный" контроль над остановкой модуля. Ведь просто число неостановленых модулей не говорит ни о чем. А что если я хочу убедиться, что лишь определенный вложенный актор остановлен? Значит, нужно отслеживать это либо по конкретной ссылке на актор, либо по его имени (которое может храниться в самом акторе). И так далее...
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 968
Joined: 21 Feb 2011, 23:44
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 270
CLAD I/O VIP students

Re: Actor Framework

Postby Aleksandr on 19 Nov 2017, 20:36

А где будет вызываться функция "Read Autostop Nested Actor Count"?

В функции Handle Last Ack Core.
Главный актор будет остановлен

Ну раз он остановлен, то и следить некому.
не заботясь о порядке остановки

Данное поведение случиться только если "главный" актор получил сообщение об остановке и никак не обработал его (нет перегрузки сообщение Stop Msg). Тут вопрос сразу должен ли он был получить такое сообщение вообще. Автоостановка всех нэстедов это дефолтное поведение, никто не запрещает "правильно" их останавливать.
А что если я хочу убедиться, что лишь определенный вложенный актор остановлен?

Всё через тот же Handle Last Ack Core...
Uniscan Research
Aleksandr
user
user
 
Posts: 97
Joined: 21 Jun 2011, 15:05
Location: Novosibirsk
Medals: 1
Gold (1)
LabVIEW Version: 2009-2017
Karma: 61
students

Re: Actor Framework

Postby Kosist on 19 Nov 2017, 21:20

Aleksandr wrote:
Главный актор будет остановлен

Ну раз он остановлен, то и следить некому.

Ну вот именно! Как же тогда удостовериться в том, что вложенный актор остановился так, как нужно; или восстановился вообще? Глюки фреймворков еще никто не отменял, поэтому просто полагаться в таком случае что :labview: само остановит актор - не всегда вариант.
Данное поведение случиться только если "главный" актор получил сообщение об остановке и никак не обработал его (нет перегрузки сообщение Stop Msg). Тут вопрос сразу должен ли он был получить такое сообщение вообще. Автоостановка всех нэстедов это дефолтное поведение, никто не запрещает "правильно" их останавливать.

Скорее всего, мы не понимаем друг друга.
Вопрос стоит не просто в том, что актор нужно остановить.
Вопрос в том, что вначале нужно удостовериться, что вложенные (nested) акторы остановлены, а уже потом останавливать главный актор.
В Вашем случае, при использовании флага "Auto-stop", такую проверку тоже можно делать, но если что-то пойдет не так, и главный актор остановится до того, как все его вложенные, Вы не увидите этого. Т.е. остановка вложенных акторов произойдет по-любому, но уже после остановки главного актора.
Вот почему я и говорю за Handle Last Ack; и вот о чем пример taras_33.
Ведь его пример - это не просто остановка вложенного актора. Это вначале проверка, что вложенный актор остановлен, а уже потом, после этого, можно закрывать главный актор. А это - уже не дублирование встроенного решения, т.к. встроенное решение должно в идеальном случае просто остановить вложенные акторы после того, как главный будет остановлен.
Надеюсь, что теперь разница ясна - или, по крайней мере, ясно почему я не согласен с просто флагом Auto-stop, и тем более Read Nested Actors Count.
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 968
Joined: 21 Feb 2011, 23:44
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 270
CLAD I/O VIP students

Re: Actor Framework

Postby Aleksandr on 19 Nov 2017, 21:48

Про дублирование о котором я говорил см. вложение.
Ну вот именно! Как же тогда удостовериться в том, что вложенный актор остановился так, как нужно; или восстановился вообще? Глюки фреймворков еще никто не отменял, поэтому просто полагаться в таком случае что :labview: само остановит актор - не всегда вариант.

Это не глюки фреймворка, а ошибки реализации. Почему вообще "основной" актор будет остановлен? Если он логгер и будет остановлен до остановки нэстедов, то какая разница чьё решение применять?
Вопрос в том, что вначале нужно удостовериться, что вложенные (nested) акторы остановлены, а уже потом останавливать главный актор.

Так и проверяйте в Handle Last Ack Core. Я уже 3ий раз об этом пишу.
Attachments
Add to Actors Array.png
Add to Actors Array.png (2.89 KiB) Viewed 5606 times
Record Nested Actor.png
Last Ask.png
Last Ask.png (28.52 KiB) Viewed 5606 times
Handle Last Ack.png
Uniscan Research
Aleksandr
user
user
 
Posts: 97
Joined: 21 Jun 2011, 15:05
Location: Novosibirsk
Medals: 1
Gold (1)
LabVIEW Version: 2009-2017
Karma: 61
students

Re: Actor Framework

Postby Kosist on 19 Nov 2017, 22:07

Aleksandr wrote:Так и проверяйте в Handle Last Ack Core. Я уже 3ий раз об этом пишу.

Так а я о чем толкую :cantbe: ? Я же за Handle Last Ack Core первым и написал.
Мое несогласие с Вами было в том, что проверка помощью Handle Last Ack Core - это то же самое, что и просто установить флаг "Auto-stop" = True. С этим я в корне не согласен, что и пытался объяснить.
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 968
Joined: 21 Feb 2011, 23:44
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 270
CLAD I/O VIP students

Re: Actor Framework

Postby taras_33 on 20 Nov 2017, 01:06

Версия первая, использующая флаги.

Test Stop Nested Actors_V1.zip
(312.8 KiB) Downloaded 87 times


Коротко: Launcher запускает главного, который в свою очередь запускает два Nested Actor. Через каждые 100mS главный посылает обоим "подчиненным" (как на русском обозвать Nested Actor?) сообщение с требованием обновить свои gauges, а так же устанавливает в false свои булевые индикаторы. При получении сообщения от главного, подчиненные Actors обновляют свои gauges и устанавливают булевые индикаторы главного в true. Этакий ACKnowledge (подверждения, мол ваше требование выполнено). (Что бы видеть мигание индикаторов я поставил небольшую задержку.)
При нажатии на кнопку, мы посылаем команду второму актеру "повиснуть" на 10 секунд.
А теперь главное. Нажали на кнопку, "повесили" актера и тут же нажали на крестик главной программы. Что произойдет? Правильно главная программа пошлет всем актерам стопы и закроется, не информируя юзера и не заботясь о последствиях. Но актер остался висеть, правда мы его повесили не смертельно и отвисев свои положеные 10 секунд он потом закроется. Такое поведение не всегда может устраивать. Хорошо что визуально мы видим "повесившегося", а если этот Актер повис намертво да еще выполняет что то критическое и его фронтальная панел не видна? Как показывает практика закон подлости работает исправно.

Поэтому предлагается версия номер два.

Test Stop Nested Actors_V2.zip
(368.43 KiB) Downloaded 102 times


Здесь реализовано как раз то, о чем вы здесь спорили. В Handle Last Ack Core происходит проверка на отсуствие работающих актеров и только после этого закрывается главная программа.

P.S. Я рад что на портале появились люди обсуждающие AF
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!
User avatar
taras_33
developer
developer
 
Posts: 292
Joined: 31 Oct 2009, 18:25
Location: Minsk -> Miami
Medals: 1
Activity (1)
LabVIEW Version: 2016
Karma: 131
CLD VIP

PreviousNext

Return to Модели программирования

Who is online

Users browsing this forum: No registered users and 2 guests

cron