Strona 1 z 1

Komunikacja miedzy petlami

: 26 wrz 2007 13:36
autor: CHRISTOPCHER
Witam

Tworze program do archiwizacji przebiegów z karty Advantecha. Mój pomysł na aplikacje jest taki ze w jednej pętli While loop wykonywane sa operacje związane z obslugą karty pomiarowej i pobieraniem z niej sygnałów analogowych i cyfrowych, natomiast w drugiej petli while loop będzie prowadzona archiwizacja przebiegów do pliku. W związku z tym moje pytanie która struktura byla by lepsza " Producer /Consumer Design Pattern(Data)" czy " Master/Slave Design Pattern. Nad mienie ze sygnały są pobierane z 5 różnych żródeł przełączane
przez multiplekser i podawane na dwa kanały analogowe( napięcie i prąd). Pochodzenie sygnału jest identyfikowane za pomocą wejść cyfrowych karty. Sygnały chce archiwizować w jednym pliku, jednak gdy wiersze bedą uzupłlnone o odpowiednia adnotacje ze jest to np: Napięcie z Łącznika 1, czyli kod do archiwizacji w zależności od źródła pochodzenia będzie się nieco różnił.

Ja mam pomysł żeby to zrobić za pmocą jednej Producer i jednej Consumer Design Pattern, czyli sygnał cyfrowy ( odpowiednia wartość liczbowa) będzie przekazywana za pomocą zmiennej lokalnej, a dane z kanałow analogoweych za pomocą kolejki i tam w zalezności od wartości jak sie znajduje w zmiennej bedzie uruchamiany odpowiedni case z kontrolkami do archiwizacji.

Będę wdzięczny za każdą radę i sugestię.

Pozdrawiam

CHRISTOPCHER

Re: Komunikacja miedzy petlami

: 27 wrz 2007 10:57
autor: Koza
Witaj,

Jak się przyjrzysz bliżej obu strukturom przez Ciebie wymienionym, zauważysz, że są one takie same (w Template'ach). Jak się jednak okaże, struktury te zmieniają się wraz z rozwojem aplikacji.

Generalnie Producer/Consumer jest zalecany gdy masz dane pobierane zdarzeniem (trigger) -np. wyprodukowano wagon sardynek w puszce i ktoś dzwoni aby je odebrać. Consumer z kolei w jakiś sposób te dane obrabia - zapisuje na dysk czy liczy FFT (lub z przykładu - zawozi puszki do sklepu). Obie pętle chodzą swoim własnym tempem, gdy Consumer nie nadąża po prostu kolejka w pewnym momencie może się przepełnić.

Master/Slave stosujesz gdy pobierasz dane w sposób ciągły - np. gdy puszki dostępne są co sekundę więc nikt nie dzwoni a i tak możesz je odbierać. Jest to struktura wygodna w momencie gdy masz wiele wątków i chcesz je ze sobą zsynchronizować (nigdy nie wiem jak to się pisze, tak samo jak zczytywać, szczytywać, sczytywać etc. - chyba w ogóle nie ma takich słów w naszym języku).

Więcej na ten temat możesz przeczytać tutaj:
Producer/Consumer:
http://zone.ni.com/devzone/cda/tut/p/id/3023

Master/Slave:
http://zone.ni.com/devzone/cda/tut/p/id/3022

Pozdrawiam,
Koza

Re: Komunikacja miedzy petlami

: 27 wrz 2007 16:15
autor: CHRISTOPCHER
Ja jak dotychczas zauważyłem miedzy nimi taka różnice że np w przypadku struktury MasterSlave pętla główna nie może sie wykonywać szybciej od podrzędnej ponieważ w tedy dane są tracone . Natomiast w przypadku ProducerConsumer tego niebezpieczeństwa nie ma. W przypadku obu struktur dochodzi do zatrzymania podrzędnej pętli w przypadku gdy ich szybkość działania jest większy od głównej. Podsumowujac z tego co się zorientowałem MasterSlave jest używana raczej gdy chodzi o synchronizacje działania rożnych pętli zależnych od głównej ( mamy pewność że nie bedzie zadnych opóżnien przy ich wywołaniu) , natomiast ProducerConsumer stosuje się do przekazywania danych gdy w głownej petli są one np generowane a w podrzędnej np zapisywane na dysk.

Co do innych istotnych różnic nie zauważyłem .