И снова очереди
-
taras_33
- professional
- Сообщения: 391
- Зарегистрирован: 31 окт 2009, 18:25
- Награды: 1
- Версия LabVIEW: 2019
- Поблагодарили: 13 раз
- Контактная информация:
И снова очереди
Пытаюсь освоить работу с очередями. Посмотрите вложенный Алгоритм предпологается такой: Верхний цикл посылает команду среднему (очередь command) записать данные, средний цикл получив команду, начитает постоянно записывать случайные числа в очередь Data. Нижний читает из очереди Data и показывает результат, пока не нажмется кнопка стоп. (Использовал и уроки любезно предоставленные уважаемым Eg .)
P.S. На форуме есть похожие примеры, но хотелось бы разобратся что к чему на примере собственного, а он упрямо отказывается работать Спасибо.
P.S. На форуме есть похожие примеры, но хотелось бы разобратся что к чему на примере собственного, а он упрямо отказывается работать Спасибо.
- Вложения
-
- 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!
So far, the Universe is winning!
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: И снова очереди
Обожаю вопросы и обсуждения на эту тему, но сейчас не могу посмотреть, т.к. дома нет
Может быть скрины выложишь?
Может быть скрины выложишь?
-
taras_33
- professional
- Сообщения: 391
- Зарегистрирован: 31 окт 2009, 18:25
- Награды: 1
- Версия LabVIEW: 2019
- Поблагодарили: 13 раз
- Контактная информация:
Re: И снова очереди
Нет проблем
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!
So far, the Universe is winning!
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: И снова очереди
Самое первое, что мне бросилось в глаза, это то, что закрытие очередей происходит тогда, когда останавливается верхний цикл, а нужно тогда, когда закончатся все параллельные циклы.
В общем нужно этот прибор запихать в самый конец, прямо перед Error Out.
Второе это то, что непонятно, зачем нужен внутренний цикл во втором цикле, который пробегает всего одну итерацию.
В общем нужно этот прибор запихать в самый конец, прямо перед Error Out.
Второе это то, что непонятно, зачем нужен внутренний цикл во втором цикле, который пробегает всего одну итерацию.
-
taras_33
- professional
- Сообщения: 391
- Зарегистрирован: 31 окт 2009, 18:25
- Награды: 1
- Версия LabVIEW: 2019
- Поблагодарили: 13 раз
- Контактная информация:
Re: И снова очереди
закрытие очередей происходит тогда, когда останавливается верхний цикл, а нужно тогда, когда закончатся все параллельные циклы.
Я вижу (в пошаговом режиме) что он пробегает только одну интерацию, а мне хочется что б он "пихал данные постоянно", поэтому я его (цикл) и всунул, да видимо не туда. Собственно поэтому я и запостил в разделе чайникиВторое это то, что непонятно, зачем нужен внутренний цикл во втором цикле, который пробегает всего одну итерацию.
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!
So far, the Universe is winning!
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: И снова очереди
Тогда возникает вопрос, когда же закончить этот внутренний цикл?
Ответ несложный, тебе нужно проверять статус очереди (имеется ли новый элемент-команда) прямо внутри этого внутреннего цикла, и если да, то выходить из него.
ПЫСЫ Только что присмотрелся, и нашел ещё несколько ошибок, о них позже.
Ответ несложный, тебе нужно проверять статус очереди (имеется ли новый элемент-команда) прямо внутри этого внутреннего цикла, и если да, то выходить из него.
ПЫСЫ Только что присмотрелся, и нашел ещё несколько ошибок, о них позже.
-
taras_33
- professional
- Сообщения: 391
- Зарегистрирован: 31 окт 2009, 18:25
- Награды: 1
- Версия LabVIEW: 2019
- Поблагодарили: 13 раз
- Контактная информация:
Re: И снова очереди
После корректировки указанных недостатков получилось следующее: См вложенный Запускаем, жмем кнопку Get, получаем непрерывное чтение , жмем кнопку стоп - не работает . Останавливаем (кнопка Abort) Включаем выключенный кусочек кода, запускаем, жмем кнопку стоп - работает. Жмем Get вылетает ошибка...
- Вложения
-
- 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!
So far, the Universe is winning!
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: И снова очереди
Жаль нет скринов, как я уже сказал. ещё есть несколько ошибок, не могу пока сказать исправил ли ты их в процессе понимания или нет.
-
mzu2006
- doctor
- Сообщения: 2456
- Зарегистрирован: 16 авг 2008, 02:12
- Награды: 3
- Версия LabVIEW: 7.1 10 11 12
- Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
- Контактная информация:
Re: И снова очереди
Пару предварительных замечаний.
Что происходит: Ты кладёшь в очередь 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 данными.
Что происходит: Ты кладёшь в очередь 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 скачиваний
Правила форума (Forum rules in Russian)
rm -rf /mnt/windows
rm -rf /mnt/windows
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: И снова очереди
Немного подкорректировал, совсем немного.
http://labviewportal.org/viewtopic.php?p=337#p337
На нижнем скрине в этом посте всё описано, именно это я и сделал:http://labviewportal.org/viewtopic.php?p=337#p337
-
taras_33
- professional
- Сообщения: 391
- Зарегистрирован: 31 окт 2009, 18:25
- Награды: 1
- Версия LabVIEW: 2019
- Поблагодарили: 13 раз
- Контактная информация:
Re: И снова очереди
Спасибо, теперь понял. Почему то когда человек объяснит, лучше доходит, чем в книжке об этом же самом прочитать Будем копать дальше
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!
So far, the Universe is winning!
-
taras_33
- professional
- Сообщения: 391
- Зарегистрирован: 31 окт 2009, 18:25
- Награды: 1
- Версия LabVIEW: 2019
- Поблагодарили: 13 раз
- Контактная информация:
Re: И снова очереди
Я предлагаю использовать variant, как основной тип данных очереди.
Следуя выше указанным советам я это и сделал, попутно добавив пару комментариев для таких же "чайников" как сам . Ничего не напутал? Значит можно использовать это как шаблон? Меня интересует обработка ошибок, я не совсем понимаю механизм. Зачем их всех собирать в кучку (в конце) и записывать в кластер, ни слова не сказав пользователю? Я так понимаю если уж мы их собрали, и произошла какая то ошибка, то нужно сообщить об этом, используя палитру Dialog and User Interface. Или я не прав?Для простоты и скорости, я обычно делаю typedef в виде cluster. Первый элемент - enum команда, второй элемент - variant c данными.
Еще раз спасибо Eg и mzu2006
- Вложения
-
- 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!
So far, the Universe is winning!
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: И снова очереди
Подожди чуток, я вот вот выложу библиотеку на конкурс, там есть всё, и команды в виде енюмов и вариант для данных и темплейт с комментариями.
-
mzu2006
- doctor
- Сообщения: 2456
- Зарегистрирован: 16 авг 2008, 02:12
- Награды: 3
- Версия LabVIEW: 7.1 10 11 12
- Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
- Контактная информация:
Re: И снова очереди
Я чуть сумбурно написал
Имелось в виду, либо сделать типом данных очереди вариант и узнавать реальный тип данных во время выполнения. Либо класть в очередь cluster из enum и variant, и узнавать тип данных, лежащий в variant по enum. enum в этом варианте общий для всей программы.mzu2006 писал(а): Есть несколько способов это сделать. Я предлагаю использовать variant, как основной тип данных очереди. После чего, попытался бы извлечь из variant строку. Получилось => значит пришла команда. Нет => значит пришли данные. Можно также извлечь из variant информацию о типе напрямую.
Для простоты и скорости, я обычно делаю typedef в виде cluster. Первый элемент - enum команда, второй элемент - variant c данными.
Здорово, значит будут две библиотеки на одну и ту же темуeg писал(а):я вот вот выложу библиотеку на конкурс
Правила форума (Forum rules in Russian)
rm -rf /mnt/windows
rm -rf /mnt/windows
-
taras_33
- professional
- Сообщения: 391
- Зарегистрирован: 31 окт 2009, 18:25
- Награды: 1
- Версия LabVIEW: 2019
- Поблагодарили: 13 раз
- Контактная информация:
Re: И снова очереди
Привет народ, так что с ошибками то? Кто нибудь пояснит?Меня интересует обработка ошибок, я не совсем понимаю механизм. Зачем их всех собирать в кучку (в конце) и записывать в кластер, ни слова не сказав пользователю? Я так понимаю если уж мы их собрали, и произошла какая то ошибка, то нужно сообщить об этом, используя палитру 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!
So far, the Universe is winning!