Praca równoległa lub jak kto woli Multithreading

Tematy związane z tworzeniem dużych aplikacji. Zaganiednia dotyczące architektury oraz zasad tworzenia optymalnych rozwiązań.
Awatar użytkownika
rumcajs
Posty: 209
Rejestracja: 17 paź 2004 00:00
Lokalizacja: Aktualnie TRW

Praca równoległa lub jak kto woli Multithreading

Post autor: rumcajs »

Witam Forumowiczów!
Problem dotyczy szczególnego przypadku chociaż jest natury ogólnej.
Interesuje mnie w jaki sposób Użytkownicy LV a w szczególności Inżynierowie LV rozwiązują problem wielowątkowości.
Mam pewne typy i rozwiązania ale interesuje mnie "jak to robią inni".
Aplikacja ma wyglądać nasteująco:
1. Pobieram z pliku N zestawów parametrów (N - liczba dowolna z reguły >50). Każdy zestaw parametrów to dane potrzebne do utworzenia Grupy i Itemów w OPC Serverze.
2. Po utworzeniu N Grup i Itemów muszę się do nich podłączyć, odbierać i wysyłać dane (generalnie odebrać przetworzyć i odpowiedzieć). Oczywiście wszystko musi się dziać jednocześnie - jak najszybciej więc każda Grupa/Item musi być osobnym wątkiem w LV przetwarzanym równocześnie.
3. Co więcej muszę mieć zarówno możliwość dodania jak i zlikwidowania Grupy/Itemu (wątka) online.
4. Oczywiście wizualizacja pracy wątków i modyfikacja online prarametrów poprzez GUI jest wymagana.
Jak widzicie rozwiązanie takiej sprawy? Any ideas? Czas rozwinąć wodze fantazji :)
Aby pohamować zapędy kolegów dodam, że LV 6.0.2 Base i użycie DSC wykluczone bo go nie posiadam.
Rumcajs.
Awatar użytkownika
rumcajs
Posty: 209
Rejestracja: 17 paź 2004 00:00
Lokalizacja: Aktualnie TRW

Re: Praca równoległa lub jak kto woli Multithreading

Post autor: rumcajs »

Panowie i Panie, zadnych pomyslow ? Nie wierze.
Mikrobi, PMaj, Bogdani,...... jakies pomysly.
Rumcajs.
Awatar użytkownika
Mikrobi
Posty: 1210
Rejestracja: 08 paź 2003 00:00
Wersja środowiska: LabVIEW 2017

Re: Praca równoległa lub jak kto woli Multithreading

Post autor: Mikrobi »

rumcajs pisze:Panowie i Panie, zadnych pomyslow ? Nie wierze. Mikrobi, PMaj, Bogdani,...... jakies pomysly. Rumcajs.
Rumcajsie nie wolno mi o tym wspominać (NDA) 8)
więc nie poruszę zatem
(absolutnie) tematu skryptowego LabVIEW, aczkolwiek to było pierwsze co mi się nasuwało. Drugie to Call By Reference Node i tablice, ale mam lekkie urwanie i nie mam czasu na większą wypowiedź (współczynnik miłosierdzia to trochę inna sprawa ;) ) Ale na początek - tablica wątków to chyba pomysł tylko na start i będzie działało wolniej niż... ha... :?: Bogdani ma urwanie głowy w pracy. PMaj też, ale... PMaj nie śpij... :!:
;)
pozdrawiam
Mikrobi

LabVIEW Champion, CLD, CPI
PMaj
Posty: 231
Rejestracja: 04 sty 2004 00:00

Re: Praca równoległa lub jak kto woli Multithreading

Post autor: PMaj »

Witam
Po krótkim przemyśleniu dochodzę do wniosku, że jest to nieco wyższa szkoła jazdy. Póki co robione przeze mnie wielowątkowe struktury nie były aż tak rozbudowane. Spędziłem chwile nad próbą implementacji reentrant - nie udało się :(
To co myślę - jeżeli pobieramy z pliku N zestawów parametrów, które będziemy wysyłać i ma to działać jak najszybciej to pasuje zrobić strukturę równoległą. To jest skomplikowane, gdyż nie znam metody pozwalającej na dynamiczne włączanie kolejnych wątków (w sensie posłużenia się jedną funkcją do komunikacji i wywolania jej wielokrotnie w tym samym momencie) - mimo usilnych prób z Reentrant i jego dynamicznym wywołaniem LabVIEW nie pozwoliło mi z poziomu VI Servera uruchomić więcej niż jednej instancji VI'a jednocześnie. --> Czyli jeżeli chodzi o strukturę równoległą, to chyba trzeba robić wszystkie bloczki samemu. Tu zostaje problem dodania i zlikwidowania grupy (ale VI Server by sobie poradził)
Mały pomysł na strukturę danych - to Cluster Typedef z odpowiednimi elementami wewnątrz, dane przesyłane przez Notifier lub jakieś FIFO (tak bym to widział w LV6) - W LabVIEW 7 do danych odbieranych User Event a do nadawania Notifier.
Drugą metodą, o której wspomniał Mikrobi jest użycie tablic. Tyle że nie będzie to działać jednocześnie, nie ciągnę więc wątku.
Użycie LabVIEW Scripting - to oczywiście sposób - ale czy ja wiem?? - Póki nie rekomendowany to może nie najlepszy sposób. Rumcajsie przyznam że masz bardzo ciekawy problem - mam nadzieję, że rozmowa się jeszcze rozwinie :)
PS. Protokół TCP/IP jest niezłym rozwiązaniem - można stworzyć server, podłączyć klientów - całkiem szybko to działa, nie wiem jednak czy taka opcja w ogóle wchodzi w grę. Chociaż to też nie równolegle ...
pzdrv
pmaj
Awatar użytkownika
rumcajs
Posty: 209
Rejestracja: 17 paź 2004 00:00
Lokalizacja: Aktualnie TRW

Re: Praca równoległa lub jak kto woli Multithreading

Post autor: rumcajs »

Panowie, Serdeczne dzięki za pomysły - może jeszcze jakieś się urodzą nowe - zachęcam do podzielenia się.
PMaj - niestety "reentrant" nie nadaje się do tego - zgadzam się w pełni.
Komunikację z OPC czy to "localhost" czy przez sieć uzyskuję przy pomocy Metod i Własności Active X OPC Servera - i z tym nie ma problemu.
Labview Scripting - przyznam się, iż niewiele wiem na ten temat - niewiele też można znaleźć na stronach NI - myślę, że na razie jest to pobożne życzenie i osobiście jestem temu przeciwny, wszak jedną z cech, która przeważyła o tym, że programuję w LV było uniknięcie skryby czyli "palcowania" kodu programu.
Wracając do wątku "wątków" planuję wykorzystać coś bardzo podobnego do Call by Reference Node Mikrobiego.
Pierwsza część składałaby się z odczytu parametrów z pliku i utworzeniu na tej podstawie Grup i Itemów w OPC Serverze (zestawienie połączeń z sterownikami PLC).
Kod "wątka" zostałby zapisany w postaci template'a (.vit), który to byłby następnie wielokrotnie uruchomiony bez pokazywania Panelu Frontowego dla komunikacji z kolejnym Itemem w Grupie. Tak więc naprawdę w tle pracowałoby ok. 50 vi'jów "wątków" równolegle. Aby zmienić parametry dla danego wątka wystarczyłoby przechowywać w tablicy Referencje do VI'jów. Można by je również dodawać i likwidować dynamicznie poprzez rozpoczęcie kolejnego lub zakończenie pracującego VI. Prawdę powiedziawszy wykorzystywana byłaby tutaj technologia określona przez NI jako VI Server. Każdy wątek de facto byłby kolejnym VI Serverem.
Do danego wątku można by się "dostać" również poprzez nazwę, wszak podczas uruchomenia po raz kolejny template'a (.vit) automatycznie do jego nazwy dodawany jest cyfrowy postfix, który akurat służyłby do identyfikacji.
Moim zdaniem tak akurat mogłoby to wyglądać.
Nie wiem tylko jak wyglądałaby sprawa wydajności.
Zastanawiam też się czy do wymiany informacji pomiędzy aplikacją główną a wątkami użyć metod i własności VI servera czy też Globali.
Jeszcze raz dzięki.
Rumcajs
Awatar użytkownika
rumcajs
Posty: 209
Rejestracja: 17 paź 2004 00:00
Lokalizacja: Aktualnie TRW

Re: Praca równoległa lub jak kto woli Multithreading

Post autor: rumcajs »

Labview Scripting
Aha.........?!
Trochę poczytałem i myślę, że byłoby to trudne do wykonania tym sposobem - a lot of effort.
Pomijając oczywiście aspekt formalno-prawny.
Ciekawe jak to się robi w C++.
Rumcajs.
ODPOWIEDZ