Strona 1 z 1

Kolejki i notyfikatory w jednym

: 13 wrz 2017 16:30
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 :)

Re: Kolejki i notyfikatory w jednym

: 13 wrz 2017 17:22
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.

Re: Kolejki i notyfikatory w jednym

: 13 wrz 2017 17:41
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 :))

Re: Kolejki i notyfikatory w jednym

: 13 wrz 2017 22:38
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 13176 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...

Re: Kolejki i notyfikatory w jednym

: 14 wrz 2017 09:29
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.

Re: Kolejki i notyfikatory w jednym

: 14 wrz 2017 11:42
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?

Re: Kolejki i notyfikatory w jednym

: 14 wrz 2017 11:48
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.

Re: Kolejki i notyfikatory w jednym

: 14 wrz 2017 13:20
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

Re: Kolejki i notyfikatory w jednym

: 14 wrz 2017 14:15
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

Re: Kolejki i notyfikatory w jednym

: 14 wrz 2017 17:08
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

Re: Kolejki i notyfikatory w jednym

: 14 wrz 2017 22:48
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ć.