Коммуникация между параллельными потоками

Общие принципы, проектирование, модуляризация, темплейты и шаблоны
Аватара пользователя
piznyur_alex
beginner
beginner
Сообщения: 43
Зарегистрирован: 11 фев 2010, 14:24
Версия LabVIEW: 2010
Контактная информация:

Re: Коммуникация между параллельными потоками

Сообщение piznyur_alex »

Путаница:
piznyur_alex писал(а):
В какой момент данные появятся в конце очереди ПОТОКА 2?

очередь не принадлежит потоку. Я попробую ответить на смежные вопросы, а ты скажи попал я или нет, хорошо?

В очереди они появятся сразу после добавления.
Когда данные обработает поток 2? Тогда, когда дойдёт очередь выполняться до узла Dequeue Element.

piznyur_alex писал(а):
в какой момент в ПОТОКЕ 2 обновляются глобальные переменные?

глобальные переменные опять таки не принадлежат потоку. Содержимое переменной обновится сразу после записи.
Когда они поток их прочитает? тогда, когда дойдёт до узла Global Variable.
понял. спасибо. То ест если два асинхронных цикла пишут информацию в одну очередь, мы точно сказать не можем, какие данные запишутся первыми?
Аватара пользователя
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: Коммуникация между параллельными потоками

Сообщение mzu2006 »

piznyur_alex писал(а):То ест если два асинхронных цикла пишут информацию в одну очередь, мы точно сказать не можем, какие данные запишутся первыми?
Какой Enque элемент выполнится первым - те и запишутся.
Аватара пользователя
Eugen Graf

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

Re: Коммуникация между параллельными потоками

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

piznyur_alex писал(а):Здравствуйте. Есть такая ситуация. Есть два параллельных потока ПОТОК 1 и ПОТОК 2. ПОТОК 1 отправляет данные в ПОТОК 2. В какой момент данные появятся в конце очереди ПОТОКА 2? Я так понимаю в момент новой итерации ПОТОКА 2? И в какой момент в ПОТОКЕ 2 обновляются глобальные переменные?
Спасибо.
Итерация потока2 произойдёт только тогда, когда поток1 запишет данные в очередь. До этого поток2 будет "висеть", это и называется синхронизацией с помощью очереди.
Аватара пользователя
piznyur_alex
beginner
beginner
Сообщения: 43
Зарегистрирован: 11 фев 2010, 14:24
Версия LabVIEW: 2010
Контактная информация:

Re: Коммуникация между параллельными потоками

Сообщение piznyur_alex »

Добрый день. Есть еще вопросик. Есть два паралельных цикла которые получают данные с разной скоростью от двух разных приборов и передают эти данные в третий основной цикл. Подскажите пожалуйста, как обьеденить эти данные в третем цикле для проведения дальнейших расчетов. Думаю над functional global. Заранее спасибо.
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Коммуникация между параллельными потоками

Сообщение IvanLis »

piznyur_alex писал(а):Добрый день. Есть еще вопросик. Есть два паралельных цикла которые получают данные с разной скоростью от двух разных приборов и передают эти данные в третий основной цикл. Подскажите пожалуйста, как обьеденить эти данные в третем цикле для проведения дальнейших расчетов. Думаю над functional global. Заранее спасибо.
Посмотрите программу: Синусоидальный сигнал
Аватара пользователя
Jakob Brontfeyn

Activity Gold Silver Black
expert
expert
Сообщения: 1729
Зарегистрирован: 28 фев 2008, 11:01
Награды: 6
Благодарил (а): 1 раз
Контактная информация:

Re: Коммуникация между параллельными потоками

Сообщение Jakob Brontfeyn »

piznyur_alex писал(а):Добрый день. Есть еще вопросик. Есть два паралельных цикла которые получают данные с разной скоростью от двух разных приборов и передают эти данные в третий основной цикл. Подскажите пожалуйста, как обьеденить эти данные в третем цикле для проведения дальнейших расчетов. Думаю над functional global. Заранее спасибо.
почему бы не сделать несколько VI и связать через глобалную переменную
как здесь http://labviewportal.org/viewtopic.php? ... 728#p23964
Не один год применяю такую методику в сложных экспериментах,
работает безотказно.
Аватара пользователя
piznyur_alex
beginner
beginner
Сообщения: 43
Зарегистрирован: 11 фев 2010, 14:24
Версия LabVIEW: 2010
Контактная информация:

Re: Коммуникация между параллельными потоками

Сообщение piznyur_alex »

Ок. Спасибо за советы. Разберусь с примером Синусоидный сигнал, а также попробую с глобальной переменной.
Евгений Панин
junior
junior
Сообщения: 52
Зарегистрирован: 02 фев 2012, 21:49
Версия LabVIEW: 18
Откуда: Москва

Re: Коммуникация между параллельными потоками

Сообщение Евгений Панин »

Добрый день.

У кого-нибудь возникала задача передавать одни и те же данные из одного цикла в несколько циклов?

Есть идеи? Как использовать одну очередь для передачи сразу в несколько циклов? Уничтажать данные, по мере полного считывания во всех циклах потребителя(так, чтобы они ещё и не повторялись). Функций очередей, на первый взгляд, недостаточно для этого... т.к. нет возможности очистить определённую область очереди. Может есть другие функции для этого?
Очередь
Очередь
Такая схема, при накоплении, будет очень прожорливой по отношению к памяти.

Может есть другие решения??? :wink:
Аватара пользователя
Chupakabra

Tutorials
professional
professional
Сообщения: 360
Зарегистрирован: 21 янв 2009, 10:50
Награды: 1
Версия LabVIEW: 2015
Откуда: Москва
Поблагодарили: 4 раза
Контактная информация:

Re: Коммуникация между параллельными потоками

Сообщение Chupakabra »

Евгений Панин писал(а):Добрый день.

У кого-нибудь возникала задача передавать одни и те же данные из одного цикла в несколько циклов?

Есть идеи? Как использовать одну очередь для передачи сразу в несколько циклов? Уничтажать данные, по мере полного считывания во всех циклах потребителя(так, чтобы они ещё и не повторялись). Функций очередей, на первый взгляд, недостаточно для этого... т.к. нет возможности очистить определённую область очереди. Может есть другие функции для этого?
Очередь.png
Такая схема, при накоплении, будет очень прожорливой по отношению к памяти.

Может есть другие решения??? :wink:
Меня тоже интересует вопрос прожорливости, хотя думаю, что создание нескольких очередей преемлемое решение, облегчающее структуру программы. Может быть накладные расходы на каждую очередь/notifier невелики?
Аватара пользователя
mark
beginner
beginner
Сообщения: 39
Зарегистрирован: 18 ноя 2010, 21:35
Версия LabVIEW: 2015

Re: Коммуникация между параллельными потоками

Сообщение mark »

Евгений Панин,

Задачу передачи данных из одного цикла в несколько сразу (причем количество принимающих циклов можно менять в процессе выполнения программы) проще всего решить с помощью событий.
Вложения
Безымянный.png
AI233
user
user
Сообщения: 73
Зарегистрирован: 22 ноя 2011, 12:23
Версия LabVIEW: 2011
Контактная информация:

Re: Коммуникация между параллельными потоками

Сообщение AI233 »

Я передаю данные между циклами так.
Изображение
Изображение
Эта :vi: вставляется в любое место программы, можно в разные циклы. read/write - задает режим чтения или записи данных. Недостаток один. Чтение либо запись происходят последовательно. Т.е. пока в одном цикле идет запись, другой ждет когда :vi: освободится.
:vi: можно например дополнить обнулением данных при первом запуске
Фактически это альтернатива глобальной переменой, потому что эту :vi: можно вставлять вообще куда угодно, в любые ваши под :vi: . Задержка от последовательного чтения/записи у меня никогда не давала о себе знать.
Евгений Панин
junior
junior
Сообщения: 52
Зарегистрирован: 02 фев 2012, 21:49
Версия LabVIEW: 18
Откуда: Москва

Re: Коммуникация между параллельными потоками

Сообщение Евгений Панин »

Есть такая "тема". Тоже пользуюсь такой моделью переменной. Главное, чтобы в настройках :vi: была последовательной. :)
zzontt
beginner
beginner
Сообщения: 15
Зарегистрирован: 31 июл 2014, 13:48
Версия LabVIEW: 2010
Контактная информация:

Re: Коммуникация между параллельными потоками

Сообщение zzontt »

Подскажите пожалуйста как реализовать одновременную остановку 3х вложенных циклов внутри главного цикла одной кнопкой, которые вращаются в конструкции приведенной ниже?
Пример в начале статьи у меня к сожалению не заработал.
Вложения
Снимок.jpg
Аватара пользователя
Andrew Lunev

Activity Professionalism
VIP
VIP
Сообщения: 957
Зарегистрирован: 11 дек 2010, 12:31
Награды: 2
Версия LabVIEW: 2014-2021
Откуда: Москва
Благодарил (а): 4 раза
Поблагодарили: 10 раз

Re: Коммуникация между параллельными потоками

Сообщение Andrew Lunev »

Начнем с самого простого варианта:
Вложения
simple.png
simple.png (10.01 КБ) 14039 просмотров
zzontt
beginner
beginner
Сообщения: 15
Зарегистрирован: 31 июл 2014, 13:48
Версия LabVIEW: 2010
Контактная информация:

Re: Коммуникация между параллельными потоками

Сообщение zzontt »

Andrew Lunev писал(а):Начнем с самого простого варианта:
Не работает такой вариант.
Ответить

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