[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 483: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 112: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/bbcode.php on line 112: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Notice: in file /includes/functions.php on line 4183: Cannot modify header information - headers already sent by (output started at /includes/functions.php:3493)
[phpBB Debug] PHP Notice: in file /includes/functions.php on line 4185: Cannot modify header information - headers already sent by (output started at /includes/functions.php:3493)
[phpBB Debug] PHP Notice: in file /includes/functions.php on line 4186: Cannot modify header information - headers already sent by (output started at /includes/functions.php:3493)
[phpBB Debug] PHP Notice: in file /includes/functions.php on line 4187: Cannot modify header information - headers already sent by (output started at /includes/functions.php:3493)
Polskie Centrum LabVIEW • Zobacz wątek - struktura producent konsument - rozmiar bufora

struktura producent konsument - rozmiar bufora

Tematy związane z tworzeniem dużych aplikacji. Zaganiednia dotyczące architektury oraz zasad tworzenia optymalnych rozwiązań.

struktura producent konsument - rozmiar bufora

Postprzez MK_Zuk » 13 kwi 2017 10:22

Witam.
W projekcie muszę zmniejszyć okno akwizycji przez co pętla producenta działa szybciej (stała częstotliwość próbkowania)
jednak kod w pętli konsumenta mimo, iż ma mniej danych nie działa dużo szybciej
w wyniku tego kolejka przepełnia się.
Testowałem rozwiązanie przedstawione w pliku (z odczytem i czyszczeniem wielu elementów)
jednak w przypadku (produkcja co 100ms, konsumpcja co 2400ms, rozmiar bufora 15) nie dochodzi do nadpisywania elementów w kolejce.
Generalnie producent wrzuca 24 elementy między kolejnymi odczytami, bufor jest 15 elementowy więc 9 powinno zostać nadpisane.
W teście nic takiego nie dzieje się, i mimo, że "liczba elementów" wskazuje wartość 15 to "tablica elementów"
w konsumencie zawiera wszystkie elementy.
Jakoś intuicyjnie nie ufam temu. Dlaczego nie dochodzi do nadpisywania elementów?
W jakiej sytuacji może dojść?
Mogę zwiększyć bufor lub zmniejszyć opóźnienie konsumenta, ale w teście chciałem sprawdzić przypadek błędny.
Dodatkowo, klaster błędu nie zwraca żadnego błędu przepełnienia.

W docelowym kodzie w kolejce znajduje się klaster zawierający tablice waveformów, których wolałbym nie gubić.
Pytanie przy okazji:
Czy jest może jakieś lepsze rozwiązanie na wyciągnięcie więcej niż jednego elementu z kolejki?

Pozdrawiam
Zuk
Załączniki
producer consumer test.png
MK_Zuk
 
Posty: 71
Dołączył(a): 01 gru 2009 11:53
Pochwały: 2
Wersja środowiska: LabVIEW 2013

Re: struktura producent konsument - rozmiar bufora

Postprzez TMa » 13 kwi 2017 11:19

Nie obsługujesz wejść 'timeout in ms' oraz wyjść 'timed out?' z funkcji 'Enqueue/Dequeue Element Function'. Przy wrzucaniu danych do kolejki program domyślnie czeka na dostęp do kolejki dopóki nie zwolni się miejsce. A przy pobieraniu z kolejki czeka aż pojawi się jakikolwiek element. Ustaw wejścia timeout na 0 i sprawdzaj/reaguj dynamicznie na wyjście timed out?


Autor postu otrzymał pochwałę
TMa
 
Posty: 195
Dołączył(a): 07 sty 2010 12:56
Pochwały: 37
Wersja środowiska: LabVIEW 2014

struktura producent konsument - rozmiar bufora

Postprzez MK_Zuk » 13 kwi 2017 11:53

MK_Zuk
 
Posty: 71
Dołączył(a): 01 gru 2009 11:53
Pochwały: 2
Wersja środowiska: LabVIEW 2013

Re: struktura producent konsument - rozmiar bufora

Postprzez Pitol » 13 kwi 2017 12:35

W przypadku pętli producenta zamiast Timeout powinieneś użyć bloczka Lossy Enqueue Element, który nie będzie czekał na wolną kolejkę, tylko wyrzuci z kolejki element z przodu aby dodać coś nowego do niej.
Użycie Timeout na tradycyjnym bloczku (Enqueue Element) spowoduje, że dany element nie zostanie wrzucony do kolejki. Po prostu bloczek poczeka i jak nie będzie miejsca w kolejce to przejdzie dalej.
Lossy Enqueue Element zagwarantuje Ci miejsce w kolejce.

Co do wyciągania większej ilości elementów z kolejki to możesz zapiąć sam bloczek Dequeue Element w pętle While/For i czytać do oporu.
Problem będzie z analizą tych danych potem bo cała pętla konsumenta się nie wyrobi...
Możesz zrobić wiele pętli konsumenta, które równolegle obsługują Twoją kolejkę.
Wszystko zależy jakie dane przesyłasz i co chcesz z nich zrobić.

EDIT:
Jest jeszcze jedna opcja.
Możesz użyc bloczka Get Queue Status. Zwraca on zawartość całej kolejki w postaci tablicy elementów.
Minus jest taki, że nie ściąga ich z kolejki.

Ale w Twoim przykładzie to może być nawet rozsądne rozwiązanie.
Producent ładuje do kolejki ile wlezie bloczkiem Lossy Enqueue Element a Konsument tylko podgląda (Get Queue Status) co jest w kolejce i analizuje te dane.
Nie musisz nic z kolejki wyciągać, bo Producent załatwia sprawę przesuwania elementów w kolejce.
Jedyne co musisz zadbać, to interpretacja tych danych. Mógłbyś dodać jakiś znacznik/iterator, dzięki któremu wiedziałbyś co to za element w kolejce i czy już go przypadkiem poprzednio nie analizowałeś.


Autor postu otrzymał pochwałę
Pozdrawiam Pitol,

Certified LabVIEW Architect, Certified TestStand Developer.
Avatar użytkownika
Pitol
Moderator
 
Posty: 888
Dołączył(a): 18 lip 2007 23:00
Lokalizacja: Kraków
Pochwały: 140
Wersja środowiska: LabVIEW 2015

Re: struktura producent konsument - rozmiar bufora

Postprzez MK_Zuk » 13 kwi 2017 13:15

MK_Zuk
 
Posty: 71
Dołączył(a): 01 gru 2009 11:53
Pochwały: 2
Wersja środowiska: LabVIEW 2013

Re: struktura producent konsument - rozmiar bufora

Postprzez Pitol » 13 kwi 2017 13:29

W kwestii szybkiego wyciągania z kolejki to wiele zależy od tego co robisz.
Jeśli te dane są ładowane bardzo szybko, ale np. raz na jakiś czas to można zrobić to zapętleniem odczytu z kolejki i późniejszą analizą całej paczki.
Jeśli dane nadajesz non stop z dużą częstotliwością to już nie będzie tak różowo, bo nie starczy Ci czasu na analizę (chyba, że zrobisz wielu konsumentów).

A co do wielu konsumentów to masz tutaj bardzo uproszczony przykład jak to może zadziałać.
Ma to wiele plusów jak i minusów. Jakbyś chciał to zastosować to najpierw trzeba by przemyśleć czy w Twoim przypadku ma to sens.
Queue.PNG
Pozdrawiam Pitol,

Certified LabVIEW Architect, Certified TestStand Developer.
Avatar użytkownika
Pitol
Moderator
 
Posty: 888
Dołączył(a): 18 lip 2007 23:00
Lokalizacja: Kraków
Pochwały: 140
Wersja środowiska: LabVIEW 2015

Re: struktura producent konsument - rozmiar bufora

Postprzez MK_Zuk » 15 kwi 2017 15:53

Dzięki za odpowiedź.
W teorii jest ok ale tak prostą strukturę raczej ciężko zastosować
w praktycznym rozwiązaniu, gdzie karta DAQ dostarcza dane w pętli producenta
i czas opóźnienia zmienia się w pewnych granicach.

Właśnie testuję rozwiązanie z wcześniejszych postów.

Pozdrawiam
Zuk
MK_Zuk
 
Posty: 71
Dołączył(a): 01 gru 2009 11:53
Pochwały: 2
Wersja środowiska: LabVIEW 2013

struktura producent konsument - rozmiar bufora

Postprzez Pitol » 18 kwi 2017 07:41

No to w takim razie zostaje odbieranie danych ze stratami.
Jeśli te straty są przez Ciebie akceptowalne to nie widzę przeszkód.
Pozdrawiam Pitol,

Certified LabVIEW Architect, Certified TestStand Developer.
Avatar użytkownika
Pitol
Moderator
 
Posty: 888
Dołączył(a): 18 lip 2007 23:00
Lokalizacja: Kraków
Pochwały: 140
Wersja środowiska: LabVIEW 2015

struktura producent konsument - rozmiar bufora

Postprzez MK_Zuk » 18 maja 2017 13:56

Dziękuję za pomoc.
Rozwiązaniem okazało się buforowanie danych w pętli producenta i wysyłanie co kilka iteracji
(wyszło co 15) i działa bez strat.
Próba wielokrotnego odbierania danych i czyszczenia kolejki w jednej iteracji konsumenta zawiodła,
jest to również dobre rozwiązanie jednak problem powodowała zmienna funkcjonalna
przekazująca parametry konfiguracyjne do przetwarzania z innej pętli.

Pozdrawiam
Zuk
MK_Zuk
 
Posty: 71
Dołączył(a): 01 gru 2009 11:53
Pochwały: 2
Wersja środowiska: LabVIEW 2013

struktura producent konsument - rozmiar bufora

Postprzez Pitol » 18 maja 2017 15:08

Czyli rozumiem, że wysyłasz dane w paczkach a nie pojedynczo?
I pętla konsumenta sobie radzi na czas z analizą większej paczki niż pojedynczych elementów?
Pozdrawiam Pitol,

Certified LabVIEW Architect, Certified TestStand Developer.
Avatar użytkownika
Pitol
Moderator
 
Posty: 888
Dołączył(a): 18 lip 2007 23:00
Lokalizacja: Kraków
Pochwały: 140
Wersja środowiska: LabVIEW 2015


Powrót do Budowa struktury aplikacji

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości

cron