И снова очереди

Простейшие вопросы в области инженерной разработки
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 391
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 13 раз
Контактная информация:

И снова очереди

Сообщение taras_33 »

Пытаюсь освоить работу с очередями. Посмотрите вложенный :vi: Алгоритм предпологается такой: Верхний цикл посылает команду среднему (очередь command) записать данные, средний цикл получив команду, начитает постоянно записывать случайные числа в очередь Data. Нижний читает из очереди Data и показывает результат, пока не нажмется кнопка стоп. (Использовал :vi: и уроки любезно предоставленные уважаемым Eg :thank: .)
P.S. На форуме есть похожие примеры, но хотелось бы разобратся что к чему на примере собственного, а он упрямо отказывается работать :wink: Спасибо.
Вложения
Queues.zip
(37.68 КБ) 128 скачиваний
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!
Аватара пользователя
Eugen Graf

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

Re: И снова очереди

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

Обожаю вопросы и обсуждения на эту тему, но сейчас не могу посмотреть, т.к. дома нет :labview:
Может быть скрины выложишь?
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 391
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 13 раз
Контактная информация:

Re: И снова очереди

Сообщение taras_33 »

Нет проблем
Вложения
main.png
main 2.png
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!
Аватара пользователя
Eugen Graf

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

Re: И снова очереди

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

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

Второе это то, что непонятно, зачем нужен внутренний цикл во втором цикле, который пробегает всего одну итерацию.
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 391
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 13 раз
Контактная информация:

Re: И снова очереди

Сообщение taras_33 »

закрытие очередей происходит тогда, когда останавливается верхний цикл, а нужно тогда, когда закончатся все параллельные циклы.
:thank:
Второе это то, что непонятно, зачем нужен внутренний цикл во втором цикле, который пробегает всего одну итерацию.
Я вижу (в пошаговом режиме) что он пробегает только одну интерацию, а мне хочется что б он "пихал данные постоянно", поэтому я его (цикл) и всунул, да видимо не туда. Собственно поэтому я и запостил в разделе чайники :haha:
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!
Аватара пользователя
Eugen Graf

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

Re: И снова очереди

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

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

ПЫСЫ Только что присмотрелся, и нашел ещё несколько ошибок, о них позже.
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 391
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 13 раз
Контактная информация:

Re: И снова очереди

Сообщение taras_33 »

После корректировки указанных недостатков получилось следующее: См вложенный :vi: Запускаем, жмем кнопку Get, получаем непрерывное чтение :super: , жмем кнопку стоп - не работает :buuh: . Останавливаем (кнопка Abort) Включаем выключенный кусочек кода, запускаем, жмем кнопку стоп - работает. :super: Жмем Get вылетает ошибка... :buuh:
Вложения
Queues.zip
(38.52 КБ) 114 скачиваний
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!
Аватара пользователя
Eugen Graf

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

Re: И снова очереди

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

Жаль нет скринов, как я уже сказал. ещё есть несколько ошибок, не могу пока сказать исправил ли ты их в процессе понимания или нет.
Аватара пользователя
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 »

Пару предварительных замечаний.

Что происходит: Ты кладёшь в очередь Data то число double, то строку - команду stop. Естественно, при разрешённой unflatten from string у тебя ожидается строка, и всё вылетает, когда приходит число.
При запрешённой, unflatten from string происходит следующее. К строке в верхнем цикле при опреации flatten to string добавляется счетчик байт в самом начале, поэтому эта строка уже не равна "Stop" и второй цикл никогда не останавливается

Что делать?
Самое простое решение: убрать вверху flatten to string (2 раза) и убрать внизу unflatten from string 1 раз. Вроде всё работает (Main-SOS). "Ура!"? Нет "караул!!!"! потому что в принципе, двоичное представление числа может совпасть с двоичным представлением какой-то команды. Что же делать?

я бы клал в очередь data что-то, что содержит информацию о типе того, что ты передаёшь + сами данные. Есть несколько способов это сделать. Я предлагаю использовать variant, как основной тип данных очереди. После чего, попытался бы извлечь из variant строку. Получилось => значит пришла команда. Нет => значит пришли данные. Можно также извлечь из variant информацию о типе напрямую.

Для простоты и скорости, я обычно делаю typedef в виде cluster. Первый элемент - enum команда, второй элемент - variant c данными.
Вложения
Main-SOS.vi
Пока работает, но так делать не надо.
(24.08 КБ) 113 скачиваний
Аватара пользователя
Eugen Graf

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

Re: И снова очереди

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

Немного подкорректировал, совсем немного.
DataQueue.png
Queues.zip
LV 2009
(50.26 КБ) 121 скачивание
На нижнем скрине в этом посте всё описано, именно это я и сделал:
http://labviewportal.org/viewtopic.php?p=337#p337
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 391
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 13 раз
Контактная информация:

Re: И снова очереди

Сообщение taras_33 »

Спасибо, теперь понял. :thank: Почему то когда человек объяснит, лучше доходит, чем в книжке об этом же самом прочитать :D Будем копать дальше
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!
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 391
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 13 раз
Контактная информация:

Re: И снова очереди

Сообщение taras_33 »

Я предлагаю использовать variant, как основной тип данных очереди.
Для простоты и скорости, я обычно делаю typedef в виде cluster. Первый элемент - enum команда, второй элемент - variant c данными.
Следуя выше указанным советам я это и сделал, попутно добавив пару комментариев для таких же "чайников" как сам :D . Ничего не напутал? Значит можно использовать это как шаблон? Меня интересует обработка ошибок, я не совсем понимаю механизм. Зачем их всех собирать в кучку (в конце) и записывать в кластер, ни слова не сказав пользователю? Я так понимаю если уж мы их собрали, и произошла какая то ошибка, то нужно сообщить об этом, используя палитру Dialog and User Interface. Или я не прав?

Еще раз спасибо Eg и mzu2006 :thank:
Вложения
Создаем очереди и юзер ивенты (юзер ивенты не используются, с ними позже)
Создаем очереди и юзер ивенты (юзер ивенты не используются, с ними позже)
Удаляем все, что непосильным трудом создано
Удаляем все, что непосильным трудом создано
Сама блок диаграмма
Сама блок диаграмма
Вторая часть
Вторая часть
Queues - 2.zip
Архив со всеми тайпдефами и Ви-ай_ями
(43.73 КБ) 116 скачиваний
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!
Аватара пользователя
Eugen Graf

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

Re: И снова очереди

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

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

Я чуть сумбурно написал
mzu2006 писал(а): Есть несколько способов это сделать. Я предлагаю использовать variant, как основной тип данных очереди. После чего, попытался бы извлечь из variant строку. Получилось => значит пришла команда. Нет => значит пришли данные. Можно также извлечь из variant информацию о типе напрямую.

Для простоты и скорости, я обычно делаю typedef в виде cluster. Первый элемент - enum команда, второй элемент - variant c данными.
Имелось в виду, либо сделать типом данных очереди вариант и узнавать реальный тип данных во время выполнения. Либо класть в очередь cluster из enum и variant, и узнавать тип данных, лежащий в variant по enum. enum в этом варианте общий для всей программы.
eg писал(а):я вот вот выложу библиотеку на конкурс
Здорово, значит будут две библиотеки на одну и ту же тему :cool:
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 391
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 13 раз
Контактная информация:

Re: И снова очереди

Сообщение taras_33 »

Меня интересует обработка ошибок, я не совсем понимаю механизм. Зачем их всех собирать в кучку (в конце) и записывать в кластер, ни слова не сказав пользователю? Я так понимаю если уж мы их собрали, и произошла какая то ошибка, то нужно сообщить об этом, используя палитру Dialog and User Interface. Или я не прав?
Привет народ, так что с ошибками то? Кто нибудь пояснит?
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!
Ответить

Вернуться в «Для чайников»