LabVIEW портал

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Обмен данными

Хочу рассказать как я реализую обмен данными различного типа между параллельными потоками в моих программах. На данный момент считаю этот способ для меня самым оптимальным. Заранее предупреждаю, что здесь будут использоваться фичи появившиеся только в 8-ой версии LabVIEW.


И так я создаю новый пустой проект в какой нибудь папке, чтобы всё относящееся к этому проекту находилось в одном месте.
 

Создаю прибор, в который помещаю два цикла, это и будут мои параллельные процессы. Называю этот прибор либо Main.vi либо Start.vi, ну это кто как хочет. Главное знать что этот прибор является главным и первым.

Для начала я покажу пример передачи РАЗНЫХ! данных из одного потока в другой с использованием комманд.

Самое первое это как остановить оба параллельных процесса одной кнопкой? Конечно можно использовать для данного случая локальную переменную, но это не всегда возможно, т.к. процессы могут находится и в разных подприборах. А что же с глобальной переменной? Да, её тоже можно использовать, даже если потоки-процессы находятся в разных подприборах, но а если процессы на разных компьютерах? Для этого есть так называемая Shared Variable, да но и её использование не всегда подходит, т.к. для этого нужен так называемый поллинг (engl. polling). То есть в процессе постоянно придётся "опрашивать" переменную, что я не люблю и никогда не использую в своих программах.

И так, мы хотим остановить оба потока одной кнопкой "stop". Для этого берём для нашего примера Queue типа Boolean.

 

Запустите этот пример в замедленном действии highlight-модус, т.е. жёлтая лампочка в меню сверху и обратите внимание на нижний поток. Он стоит, там ничего не происходит, пока не нажата кнопка стоп!!! Это говорит о том что нижний поток не требует никаких ресурсов CPU. Если бы мы использовали вместо Queue например локальную переменную, то оба процесса время от времени опрашивали бы эту самую переменную. А у нас выходит что нижний процесс ждёт изменения, без пожирания каких либо ресурсов. В программах с несколькими процессами это не критично, но а если у вас программа из 100 и более параллельных процессов, и каждый время от времени опрашивает переменную, хотя этого можно избежать.

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


 

И так мы хотели уметь не только останавливать потоки одновременно, но и передавать какие нибудь данные из одного в другой. Как же это сделать?

А для этого нам нужна Queue "неопределённого" типа, так как заранее неизвестно что мы хотим передавать из одного потока в другой. Ведь мы хотим передавать либо boolean, либо данные (например цифры или строку). Остановимся для начала на цифрах.

А что значит "неопределённый" тип данных. Я знаю как минимум три:
1. строка, т.е. string
2. variant
3. массив, например типа U8

Почему же строка является неопределённым типом? Да просто можно любой тип, а так же что немаловажно любого размера, переделать в строку, а так же наоборот из строки получить нужный (заранее известный) тип данных. Я использую в своих программах именно строку, т.к. данные переделанные в неё отображаются так же как и в памяти компъютера, не занимая при этом больше места, чем они должны занимать. Так же это более распространённый тип, используемый и в других языках программирования. Кроме того строку можно запросто отправить например через последовательный порт или TCP/IP, для удалённой коммуникации.

И так меняем тип очереди (Queue) с boolean на string.

 Самое первое что приходит теперь в голову, как же мне отправлять два разных типа данных в очередь строкового типа?
Да, для этого конвертируем данные в строку с помощью виай Flatten To String перед их отправлением в очередь.

 

 

И так с верхним циклом вроде бы всё понятно, просто конвертируем какие бы то ни были данные в строку и отправляем в очередь.
А что делать в нижнем цикле? Я предлагаю конвертировать данные из строки обратно в данные используя виай Unflatten From String.

Да, но ведь тип должен быть заранее известен! Что же делать, какой тип прицепить сверху этого виай? Ведь у нас их два разных?

 Выход есть! О типе данных находящихся в "пакете" можно сообщать. Для этого можно просто прицепить его перед самими данными! Вот как это делается.

 

 

Всё, можно сказать, программа уже работает!
Есть несколько интересных идей как всё сделать удобнее и понятнее, но об этом в следующих уроках.

 

 

Комментарии  

 
0 #1 Роман Заболотников 03.10.2010 07:09
А как например три три цикла остановить параллельных?
Цитировать
 
 
0 #2 Евгений Граф 08.10.2010 18:57
Это просто, задай этот вопрос в форуме.
Цитировать
 
 
0 #3 Pavel 05.03.2011 11:35
Отличный пример, спасибо большое!
Цитировать
 

Добавить комментарий


Защитный код
Обновить