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

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

Activity Tutorials Black
professional
professional
Сообщения: 337
Зарегистрирован: 03 мар 2008, 12:41
Награды: 3
Версия LabVIEW: 2010
Откуда: Кишинев
Контактная информация:

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

Сообщение Forward »

eg писал(а):Он может только на короткое время работать медленнее, иначе очередь переполнится.
Переполнится, если задать максимальный размер, что плохо, ибо система повиснет, пока очередь не освободится. А если не задавать, то постепенно набегает задержка, что тоже плохо, т.к. в итоге я все далее ухожу от "реального времени".
mzu2006 писал(а):
eg писал(а):использовать например нотифаер
А чем это лучше? Быстрее? И как ждать одновременно нотифайера и на очереди?
Я так понял имелось ввиду, что цикл будет синхронизироваться от нотифайера вместо очереди, т.е. придется пропускать данные.
Или нет?
mzu2006 писал(а): Ещё можно поиграть с приоритетами выполнения - скажем у потока 2 - макисмальный, у потока 3 чуть меньше и у потока 1
самый маленький. И разнести 1 и (2 и 3) по разным excution systems...
Попробую. Спасибо.
Аватара пользователя
Eugen Graf

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

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

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

Да, ты всё правильно понял. Если у тебя действительно такая проблема, что я себе почти не могу представить, то тебе нужен такой комп помощнее. Либо нужно работать с массивами данных, то есть обрабатывать данные кусками, а не поодиночке. Или пропускать данные или ещё как вариант высчитывать среднее математическое и из например 100 значений делать одно и работать с ним.

Обычно передача данных происходит медленнее, чем их обработка компом. Редко когда случается наоборот, например если ты используешь суперсложные математические операции как например FFT.
Аватара пользователя
Konstantin Sumenko

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

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

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

Правильно сказано. Во-первых если система не успевает, то это может быть связано, например, с применением сложных с вычислительной точки зрения операций на приходящих данных в таком случае следует найти балланс между временем обработки и кол-вом обрабатываемых данных за один проход. Во-вторых следует посмотреть на кол-во ядер процессора, стоит ли говорить о разнице в работе обычного БПФ и распараллеленного БПФ.
Аватара пользователя
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 »

Forward писал(а):А если не задавать
то переполнится память.
Forward писал(а):набегает задержка
- как-то раз у меня так получалось - я просто выкидывал все необработанные сообщения, кроме команд.
mzu2006 писал(а):цикл будет синхронизироваться от нотифайера вместо очереди
при этом будут пропускаться команды (например, команда "завершить работу"), что недопустимо.

Но сперва надо сделать анализ работы программы с помошью профайлера и выяснить, что отнимает наибольшее время. Может быть проблема в чём-то другом.
Аватара пользователя
Eugen Graf

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

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

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

mzu2006 писал(а): - как-то раз у меня так получалось - я просто выкидывал все необработанные сообщения, кроме команд.
Желательно выкидывать данные раньше, то есть не отсылать их получателю.
Аватара пользователя
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 »

eg писал(а):Желательно выкидывать данные раньше, то есть не отсылать их получателю.
Полностью согласен. Чем раньше выкинешь, тем лучше. В принипе, лучше бы такие данные и не измерять если есть такая возможность (скажем что-то вроде Lossy Enque от драйвера самого нижнего уровня). Или ставить измерения на паузу через pause trigger (если устойство это поддерживает) в зависимости от заполненности очереди.

Но сначала профайлер и анализ того, что тормозит. А то можно наоптимизировать :)
Аватара пользователя
Forward

Activity Tutorials Black
professional
professional
Сообщения: 337
Зарегистрирован: 03 мар 2008, 12:41
Награды: 3
Версия LabVIEW: 2010
Откуда: Кишинев
Контактная информация:

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

Сообщение Forward »

Все ясно. Всем спасибо. Вообще с такой штукой я сталкивался при наверное корявом разбиении задачи на потоки (драйверы + всё остальное). И то это было как-то рэндомно: то обработка отстает, то опережает... Да функции были серьезные, в т.ч. и БПФ. После "перестроения" и уменьшения частоты обновления индикаторов такой проблемы вроде не наблюдалось. В общем, позже будет время, вернусь к этой задачей - проанализирую всё еще раз и опишу подробнее. Причем, постараюсь полностью убить возможности usb хоста PC, железо это позволяет.
Confocal
assistant
assistant
Сообщения: 104
Зарегистрирован: 15 авг 2008, 11:55
Версия LabVIEW: 8.5
Откуда: Россия, Московская область
Контактная информация:

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

Сообщение Confocal »

Скажите для чайников, если говорится, что есть три параллельных потока, имеется ввиду три параллельных цикла
с очередями?
Аватара пользователя
Eugen Graf

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

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

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

Да, именно так.
При чём циклы могут находится в одном :vi: или же в отдельных Sub :vi: .
Confocal
assistant
assistant
Сообщения: 104
Зарегистрирован: 15 авг 2008, 11:55
Версия LabVIEW: 8.5
Откуда: Россия, Московская область
Контактная информация:

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

Сообщение Confocal »

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

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

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

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

Можно так, а можно снимать данные и передавать их в параллельный поток для обработки. Можно(не значит нужно) так же разбить обработку на несколько ступеней (то есть опять же параллельных потоков).
Всё зависит от фантазии программиста.
Confocal
assistant
assistant
Сообщения: 104
Зарегистрирован: 15 авг 2008, 11:55
Версия LabVIEW: 8.5
Откуда: Россия, Московская область
Контактная информация:

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

Сообщение Confocal »

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

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

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

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

Блок диаграмму в студию, будем изучать.
Confocal
assistant
assistant
Сообщения: 104
Зарегистрирован: 15 авг 2008, 11:55
Версия LabVIEW: 8.5
Откуда: Россия, Московская область
Контактная информация:

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

Сообщение Confocal »

Пока это по шаблону в сыром виде. Нужно, чтобы нижний цикл опрашивал прибор по СОМ и выдавал значение в верхний цикл.
Вложения
diag1.PNG
Аватара пользователя
Eugen Graf

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

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

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

А что если в нижнем цикле выставить таймаут при чтении очереди? Тогда она сама по себе будет опрашивать прибор и посылать данные в верхний цикл.
Ответить

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