Библиотека "Tasking"

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

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Библиотека "Tasking"

Сообщение Eugen Graf »

Выкладываю свою библитотеку для общения между потоками в программе, которой на данный момент пользуюсь. Распаковать в папку Programm Files->National Instruments->LabVIEW->Userlib.

С помощью этих приборов можно организовать общение между параллельными потоками. Все приборы записи и чтения имеют входы и выходы "команда" и "данные".

Если возникнут вопросы по использованию спрашивайте. В общем принцип общения я обьяснил в следующих темах:
/viewtopic.php?f=23&t=153
/viewtopic.php?f=23&t=159
/viewtopic.php?f=23&t=504
Вложения
Tasking.zip
LV 8.2
(100.47 КБ) 2399 скачиваний
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: Библиотека "Tasking"

Сообщение mzu2006 »

Библиотечка мне понравилась, спасибо.
Есть только один ньюанс: refnum на очередь теоретически действителен только пока та VI, что его сделала
работает. (Иногда, случайно, он бывает действителен и позже - сборщик мусора запускается асинхронно).
Т.е. в Labview 7.1 я запускал "демон", в котором заводилась эта очередь.
Вопрос: а как это правило работает с классами? Не кроется ли здесь коварная западня?
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Библиотека "Tasking"

Сообщение Eugen Graf »

Прибор Tasking Open это самый первый прибор во всей программе. Из него передаётся выход на все входы всех параллельных потоков. В общем референсы на все очереди открываются именно там, а не в каждом потоке свой референс поотдельности. Дла чего? А для того, что бы все потоки уже заранее знали все референсы на все очереди и могли друг другу посылать команды.

Прибор Tasking Close это самый последний прибор во всей программе. Он должен выполнятся только после того, как все параллельные потоки закончили свою работу.

Остальные приборы применяются для коммуникации между потоками.

Сборщик мусора (я подозреваю это что то наподобии Error Handler) можешь запускать отдельным потоком и отправлять ему все возникшие ошибки из любого другого параллельного потока, а он эти ошибки обрабатывает - например записывает в файл ошибок, отправляет некоторые из них на лицевую панель или показывает диалог ошибки.

Вот на картинке обведены Tasking Open, Tasking Close и все параллельные потоки в программе.
Вложения
Tasking.png
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Библиотека "Tasking"

Сообщение Eugen Graf »

Ну а если хочется немного динамики в программе. То у меня есть полностью динамичная библиотека под названием Publish Subscriber. Там сначала запускается один единственный поток - Supervisor (или Dispatcher), который динамически регистрирует все референсы и записывает их в таблицу.
Каждый параллельный поток не общается напрямую друг с другом, а отправляет команды этому диспетчеру. А диспетчер в свою очередь, смотрит по таблице кому предназначена эта команда и перенаправляет команду нужному потоку.
Эта конструкция мне нравится намного больше чем статическая и я собираюсь переписать её на ООП. Вот тогда будет самый настоящий переворот!
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: Библиотека "Tasking"

Сообщение mzu2006 »

eg писал(а):Прибор Tasking Open это самый первый прибор во всей программе.
Это понятно. Я, наверное, плохо объяснил. Проблема поджидает, тогда, когда этот прибор перейдёт в состояние idle, и Front Panel которых не загружена.
eg писал(а):Сборщик мусора
запускается LabVIEW - это классический garbage collector, которй уничтожает все references, которые были созданы приборами перешедшими в состояние idle и Front Panel которых не загружена.

Я спрашивал, срабатывает ли он в случае использования классов. Видимо, да.
eg писал(а):Ну а если хочется немного динамики в программе.
eg писал(а):Там сначала запускается один единственный поток - Supervisor (или Dispatcher), который динамически регистрирует все референсы и записывает их в таблицу.

О-о-о вот это мне нравится больше. Например, при использовании такого механизма log не прервётся от запуска к запуску приложения, что важно.
eg писал(а):я собираюсь переписать её на ООП. Вот тогда будет самый настоящий переворот!
жду с нетерпением
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Библиотека "Tasking"

Сообщение Eugen Graf »

mzu2006 писал(а): Есть только один ньюанс: refnum на очередь теоретически действителен только пока та VI, что его сделала работает.
Ещё раз перечитал, и теперь у меня вопрос - с чего ты это взял? Или я чего то недопонимаю?
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: Библиотека "Tasking"

Сообщение mzu2006 »

Факт: когда прибор, в котором создалась ссылка на очередь, переходит в состояние idle, то очередь уничтожается.

(запусти свой первый прибор, запиши его результат в global. потом запусти, например, последний прибор, на вход которго, подаётся результат из этой global - всё - ошибка)

Использовать твою библиотеку можно строго так, как ты используешь в приведённом выше примере - т.е. когда Tasking Open VI - это subVI главной VI, которая прекращает работу (тем самым переводя Tasking Open в состояние idle) только в конце работы ппрограммы.

Мне очень нравится принцип взаимодействия частей программы заложенный в этой библиотеке. Но хотелось бы, чтобы не было привязанности к определённой архитектуре. Например, если у тебя главная VI в какой-то момент выгружается из памяти (например, запустив другую VI через VI сервер), то очереди будут удалены, и такой механизм не работает. Не сработает и запуск через VI сервер.

Поэтому я и написал, что динамически мне нравится больше. Сам я запускаю daemon который регистрирует все такие обращения. Daemon работает не зависимо от основной VI.

К сожалению от приложения к приложению daemon пишется заново.
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Библиотека "Tasking"

Сообщение Eugen Graf »

Сделал простенький примерчик:

Изображение

Download
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Библиотека "Tasking"

Сообщение Eugen Graf »

Усложняем задачу и добавляем ещё один параллельный цикл. Теперь верхний отсылает в средний команду "get", средний генерирует число и отправляет его в нижний цикл, а нижний добавляет единичку и отправляет в верхний.
Вложения
Tasking_Example.vi
(33.58 КБ) 301 скачивание
TaskingExample1.png
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Библиотека "Tasking"

Сообщение Eugen Graf »

Ну и конечно же можно для экономии места в блоковой диаграмме, да и вообще для лучшего обзора, поместить два нижних цикла в подприборы. Вот так, шаг за шагом, создаются мои проги с использованием этой библиотеки.
Вложения
TaskingExample2.png
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Библиотека "Tasking"

Сообщение Eugen Graf »

Ну а сам смысл такой конструкции в том, что каждый такой параллельный цикл имеет своё предназначение,т.е. должен выполнять какую то определённую работу и поэтому такой прибор называется Task.
Для примера:
один прибор отвечает за главную лицевую панель (т.е. генерирует команды по нажатию на кнопки)
другой прибор считывает данные с прибора и отправляет считанные данные третьему
который например обрабатывает данные, преобразует их в числа и отправляет всем желающим,
например таску, который записывает эти данные на диск
или же главному, который показывает их юзеру

Должен добавить, что главный прибор у меня состоит обычно из двух циклов: один обработчик событий с лицевой панели, а другой только выдаёт данные на лицевую панель.
Аватара пользователя
Konstantin Sumenko

Activity Bronze
expert
expert
Сообщения: 1439
Зарегистрирован: 17 июл 2008, 12:20
Награды: 2
Версия LabVIEW: 2010
Откуда: Moscow
Поблагодарили: 1 раз
Контактная информация:

Re: Библиотека "Tasking"

Сообщение Konstantin Sumenko »

Я на GOOP'е тоже написал себе набор инструментов для работы с программой, использующей многопоточность.
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Библиотека "Tasking"

Сообщение Eugen Graf »

Если не зацопирайтено выкладывай, посмотрим, обсудим.
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Библиотека "Tasking"

Сообщение Eugen Graf »

Почему никто не говорит что библиотека нихрена не работает? Кто нить ваще скачивал и открывал её?
Аватара пользователя
Konstantin Sumenko

Activity Bronze
expert
expert
Сообщения: 1439
Зарегистрирован: 17 июл 2008, 12:20
Награды: 2
Версия LabVIEW: 2010
Откуда: Moscow
Поблагодарили: 1 раз
Контактная информация:

Re: Библиотека "Tasking"

Сообщение Konstantin Sumenko »

Я пока не скачивал.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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