Kolejki i notyfikatory w jednym
- dajpanspokój
- Posty: 145
- Rejestracja: 05 lis 2015 08:15
- Wersja środowiska: LabVIEW 2016
Kolejki i notyfikatory w jednym
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
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 439 razy
- Pitol
- Moderator
- Posty: 984
- Rejestracja: 19 lip 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Kraków
Re: Kolejki i notyfikatory w jednym
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.
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 433 razy
- dajpanspokój
- Posty: 145
- Rejestracja: 05 lis 2015 08:15
- Wersja środowiska: LabVIEW 2016
Re: Kolejki i notyfikatory w jednym
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
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
- Pitol
- Moderator
- Posty: 984
- Rejestracja: 19 lip 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Kraków
Re: Kolejki i notyfikatory w jednym
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.
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...
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.
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 450 razy
- Pitol
- Moderator
- Posty: 984
- Rejestracja: 19 lip 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Kraków
Re: Kolejki i notyfikatory w jednym
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.
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 465 razy
- dajpanspokój
- Posty: 145
- Rejestracja: 05 lis 2015 08:15
- Wersja środowiska: LabVIEW 2016
Re: Kolejki i notyfikatory w jednym
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?
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?
- Pitol
- Moderator
- Posty: 984
- Rejestracja: 19 lip 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Kraków
Re: Kolejki i notyfikatory w jednym
To właśnie już zostawiłem Tobie
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.
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.
-
- Administrator
- Posty: 1315
- Rejestracja: 30 lip 2003 00:00
- Wersja środowiska: LabVIEW 2015
- Lokalizacja: Ruda Śląska
- Kontakt:
Re: Kolejki i notyfikatory w jednym
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
bogdani
- Pitol
- Moderator
- Posty: 984
- Rejestracja: 19 lip 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Kraków
Re: Kolejki i notyfikatory w jednym
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.
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.
- Załączniki
-
- Q+N14_v2.1.zip
- (96.63 KiB) Pobrany 411 razy
- dajpanspokój
- Posty: 145
- Rejestracja: 05 lis 2015 08:15
- Wersja środowiska: LabVIEW 2016
Re: Kolejki i notyfikatory w jednym
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
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
- Pitol
- Moderator
- Posty: 984
- Rejestracja: 19 lip 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Kraków
Re: Kolejki i notyfikatory w jednym
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
Co z tym teraz zrobisz to już Twoja sprawa.
Jak coś to wal śmiało, będziemy kombinować.
Cel, jakim było pozbycie się duplikowanego kodu został osiągnięty
Co z tym teraz zrobisz to już Twoja sprawa.
Jak coś to wal śmiało, będziemy kombinować.