Kolejki i notyfikatory w jednym

Tematy związane z tworzeniem dużych aplikacji. Zaganiednia dotyczące architektury oraz zasad tworzenia optymalnych rozwiązań.
Awatar użytkownika
dajpanspokój
Posty: 145
Rejestracja: 05 lis 2015 08:15
Wersja środowiska: LabVIEW 2016

Kolejki i notyfikatory w jednym

Post autor: dajpanspokój »

Heja :)
Mam dla was lamiglowke

Stworzylem projekt, ktory posiada 2 moduly, umieszczone w 2 subpanelach w Mainie, A i B.
Jeden modul (A) jest szybki, drugi (B) jest wolny (powiedzmy ze B musi cos tam liczyc).
Chce obydwu zmieniac kolor za pomoca tego samego slidera ale chcialbym tez moc je kontrolowac osobno, tzn zmienic kolor tylko jednemu. Chce miec pewnosc ze to co wyslalem do konkretnego modulu, musi byc wyegzekwowane, a to co wysylam wszystkim naraz musi byc tracone (jeden dziala wolniej niz drugi, wiec nie moge zapchac mu kolejki).

Moje rozwiazanie jest takie ze kazdy z tych modulow ma 2 loopy: jeden odczytuje swoja kolejke i drugi, ktory odczytuje swoje notyfikacje. Kolejka wysylam wiadomosci do konkretnych modulow, a notyfikacja wysylam wiadomosci do wszystkich naraz.

Niestety zmiana koloru to jest kod ktory w kazdym module powtarza sie w obu tych petlach, mimo ze nazywa sie tak samo, i dziala dokladnie w ten sam sposob.

Czy jest mozliwosc polaczenia tych dwoch rownoleglych petli w taki sposob, zeby zmiana koloru sie nie powtarzala w dwoch miejscach?

Dzieki za pomysly :)
Załączniki
Q+N14.rar
(88.66 KiB) Pobrany 395 razy
Obrazek
Awatar użytkownika
Pitol
Moderator
Posty: 982
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

Re: Kolejki i notyfikatory w jednym

Post autor: Pitol »

Nie chciało mi się pisać to zrobiłem...

Moje rozwiązanie niekoniecznie będzie najlepsze w tym przypadku, ale nic w 5 minut lepszego nie wymyśliłem.
Rozwiązanie sprowadza się do tego, że wywaliłem notyfikacje. A co...
Moduły mają tylko kolejki.

W momencie zmiany suwaka sprawdzane są kolejki A i B.
Jeśli w którejkolwiek jest już instrukcja "ChangeColour" to zastąp ją nową.
Niestety w 5 minut nie wpadłem jak najlepiej wyrzucić jeden element z kolejki nie psując reszty więc bezczelnie czyszczę kolejkę i buduję ją od nowa.
Zapewne jest coś bardziej optymalnego ale to sobie poszukaj sam.

Idea jest prosta - jeśli nie chcesz zapychać kolejki to najpierw sprawdź co w niej siedzi i w zależności od tego co tam znajdziesz to zrób coś, lub nie...
Mam nadzieję, że chociaż pomogłem naprowadzić Cie na to co chcesz osiągnąć.

Jak coś to pisz.
Załączniki
Q+N14_NEW.zip
(87.29 KiB) Pobrany 381 razy
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
Awatar użytkownika
dajpanspokój
Posty: 145
Rejestracja: 05 lis 2015 08:15
Wersja środowiska: LabVIEW 2016

Re: Kolejki i notyfikatory w jednym

Post autor: dajpanspokój »

Hej Pitol. To nie jest takie proste :)
Twoje rozwiazanie nie gwarantuje ze to co wysle na kolejke zostanie wykonane, bo jak mu zakolejkuje 3 zmiany koloru - bialy, czarny, bialy i rusze sliderem to te bialo czarne sie usuna. A jak je nazwiesz je inaczej to znowu skopiujesz kod, dlatego to jest ciekawy problem :))
Obrazek
Awatar użytkownika
Pitol
Moderator
Posty: 982
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

Re: Kolejki i notyfikatory w jednym

Post autor: Pitol »

Ee tam. Nie zauważyłem, że biały/czarny korzysta z tej samej instrukcji.
Ale sposób na to jest. Wystarczy dodać dodatkowy atrybut do instrukcji od Slidera.
Ja np. skorzystałem z atrybutów Varianta.
Tak więc z kolejki usuwane będą tylko te elementy, które mają znacznik "Slider".
Więc teraz możesz sobie zakolejkować biały/czarny na wolnym wątku i ruszać Sliderem do woli.
Zakolejkowane biały/czarny się wykonają, a na końcu wpadnie instrukcja ze Slidera.
Slider.PNG
Slider.PNG (15.72 KiB) Przejrzano 13027 razy
Chyba, że znów coś nie rozumiem. Jakby co, to prostuj ;)


EDIT: znalazłem jednego buga w moim rozwiązaniu. Jutro go postaram się poprawić.
Ogólnie chodzi o to, że ta pętla FOR przy sprawdzaniu elementów kolejki nie jest dobrze zrobiona.
Bo jak znajdzie element kolejki od Slidera, to się zatrzyma i skasuje wszystkie elementy za nią.
Wystarczy przerobić tak, żeby usuwał z kolejki tylko elementy Slidera, zostawiając jeden.
Dziś już za późno, spać też trzeba. Jutro podeślę rozwiązanie...
Załączniki
Q+N14_NEW.zip
v2.0
(88.61 KiB) Pobrany 392 razy
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
Awatar użytkownika
Pitol
Moderator
Posty: 982
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

Re: Kolejki i notyfikatory w jednym

Post autor: Pitol »

OK. Już to mniej więcej ogarnąłem.
Podmień sobie jeden plik w projekcie.

Teraz będzie to działać tak, że wszystkie elementy z kolejki zostaną przepuszczone, z wyjątkiem tych pochodzących od suwaka.
W przypadku suwaka przepuszczany będzie tylko jeden element.
Załączniki
CheckQueueStatuses.vi
(15.28 KiB) Pobrany 395 razy
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
Awatar użytkownika
dajpanspokój
Posty: 145
Rejestracja: 05 lis 2015 08:15
Wersja środowiska: LabVIEW 2016

Re: Kolejki i notyfikatory w jednym

Post autor: dajpanspokój »

Spoko pomysl i dziala:)
Troche mi sie nie podoba to usuwanie kolejki i nakladanie na nowo, bo jak ten projekt bedzie duzy to jezeli wiadomosci beda zawieraly jakies dane, to ten proces niszczenia i nakladania na kolejke moze byc dosc wolny albo zabierac duzo pamieci. Ale nie wiem czy tak jest, moze kolejki nie kopiuja danych przy nakladaniu i sciaganiu?
Obrazek
Awatar użytkownika
Pitol
Moderator
Posty: 982
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

Re: Kolejki i notyfikatory w jednym

Post autor: Pitol »

To właśnie już zostawiłem Tobie :p

Nie mam czasu poszukać, ale pewnie jakiś lepszy sposób jest.
Jedyny problem jaki widzę w tym rozwiązaniu, to taki, że jeśli między GetQueueStatus a FlushQueue nastąpi wpisanie czegoś do kolejki, to ten element zostanie utracony.
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
bogdani
Administrator
Posty: 1315
Rejestracja: 30 lip 2003 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Ruda Śląska
Kontakt:

Re: Kolejki i notyfikatory w jednym

Post autor: bogdani »

Moment zapisu w czasie miedzy odczytem kolejki a jej czyszczeniem, można zablokować np. Semaforem, żeby nie pojawił się wyścig, co grozi właśnie utratą danych w tym przypadku.

bogdani
Ktoś ci pomógł na forum? Podziękuj dając pochwałę.

Obrazek Obrazek Obrazek
Awatar użytkownika
Pitol
Moderator
Posty: 982
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

Re: Kolejki i notyfikatory w jednym

Post autor: Pitol »

A właśnie wymyśliłem jak to obejść. Znaczy się nie usuwam kolejki już.
Bo jak wyczytałem w mądrych miejscach, lepiej zmienić ideę niż brnąć w złe rozwiązanie.

Dodałem dla każdego modułu po kolejce (A_Slider i B_Slider), które są jednoelementowe (bardzo ważne!).

Każdy moduł do tej pory czekał na element w kolejce(A) bezterminowo (Timeout = -1).
Zmieniłem ten timeout na 10ms, żeby móc wykorzystać moment, gdy w kolejce(A) nic nie ma.
Wtedy sprawdzam tą drugą kolejkę (A_Slider). Jeśli jest nowy element, to przepisz go do kolejki głównej (A).
Nie jest to byćmoże najbardziej optymalne rozwiązanie, ale całość ma służyć za przykład więc nie czepiajmy się.
Głównie chodziło mi o temat przewodni autora: "ma być tylko jedno miejsce gdzie zmieniany jest kolor".
U mnie działa. Sprawdź i daj znać co o tym myślisz.
Slider.PNG
Załączniki
Q+N14_v2.1.zip
(96.63 KiB) Pobrany 386 razy
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
Awatar użytkownika
dajpanspokój
Posty: 145
Rejestracja: 05 lis 2015 08:15
Wersja środowiska: LabVIEW 2016

Re: Kolejki i notyfikatory w jednym

Post autor: dajpanspokój »

Oooo Pitol, takie cos jest o wiele lepsze! Mozna totalnie zastapic notyfikacje kolejkami 1-elementowymi ktore sie beda nadpisywaly jak bedzie nowa wiadomosc do wielu. Dzieks za pomysl

Edit: Teraz jak o tym mysle to w sumie wyszloby na to samo jakbym mial notyfikator zamiast tej 1-elementowej kolejki. Tez bym dal timeout i sie krecil w kolko jak nic nie mam na obu
Obrazek
Awatar użytkownika
Pitol
Moderator
Posty: 982
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

Re: Kolejki i notyfikatory w jednym

Post autor: Pitol »

Dokładnie. Notyfikacja to kolejka jednoelementowa. Oczywiście jakieś tam różnice są, ale w szczegóły wchodzić nie będziemy.

Cel, jakim było pozbycie się duplikowanego kodu został osiągnięty :ymapplause:
Co z tym teraz zrobisz to już Twoja sprawa.
Jak coś to wal śmiało, będziemy kombinować.
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
ODPOWIEDZ