zabrałem się za moją pierwszą większą aplikację i oczywiście mam problemy. W aplikacji (będzie ona działała na myRIO) będę miał kilka równoległych pętli while pracujących z różnymi częstotliwościami. Pytanie jest proste: jakim mechanizmem zatrzymywać wszystkie pętle? Na szkoleniach i w znalezionych przykładach najczęściej są dwie pętle (consumer-producer) i można je zatrzymać chociażby poprzez kolejkę. Ale w przypadku kilku pętli kolejka zostanie opróżniona przez pierwszą pętlę... Bardzo proszę o porady
Mozesz sobie dodac zmienna Boolean ktorej wartosc podlaczyc do stop w kazdej petli (zmienne lokalne). Jesli zmienisz wartosc tej zmiennej na True to wszystkie petle sie zatrzymaja (oczywiscie przy warunku Stop if true).
Gdy wszyscy wiedzą, że coś jest niemożliwe, przychodzi ktoś, kto o tym nie wie, i to robi...
Kilka pętli -> kilka kolejek
Każda pętelka to swego radzaju maszyna stanów, nie zależnie od tego czy bazuje na UE czy kolejkach. Każda pęta powinna miec jakiś mechanizm komunikacji tak aby pozostałe mogły się z nią porozumieć.
Jeżeli w pewnym momencie decydujesz zatrzymac aplikację najlepiej wysłać wiadomośc do kazdej z pętelek aby poprawnie zwolniła wszystkie zasoby i się wyłączyła.
Jeżeli nie chcesz produkować oddzielnych kolejek dla każdej z pętli możesz użyć tylko jednej kolejki.
W menu kolejek jest funkcja, pozwalająca podejrzeć elementy kolejki (Preview Queue chyba).
Więc jeśli wyślesz do kolejki stan QUIT, to każda z pętli może podejrzeć ten stan w kolejce i na niego zareagować, bez konieczności wyciągania tego elementu z kolejki.
Dzięki za podrzucone pomysły. Oczywiście kolejki do przesyłania danych pomiędzy pętlami będę miał, ale ze względu na planowaną sporą liczbę tych pętli nie za bardzo chciałem robić dodatkowe kolejki do sterowania stanem każdej pętli osobno. Chyba spróbuję rozwiązania z jedną kolejką i "podglądania" jej zawartości we wszystkich pętlach.
Witam.
Pierwsze pytanie jest takie:
Czy tylko jedna pętla będzie Masterem i będzie mogła generować rozkaz zatrzymania
dla pozostałych, czy może zatrzymanie dowolnej pętli ma zatrzymać cały program?
Jeżeli chodzi o rozwiązania to ja widzę 2.
1. Zmienną lokalną od przycisku STOP,
2. zamiast kolejki użyć powiadomienia ale wtedy jest 1 writer multiple readers.
Osobiście odradzam zmiennych lokalnych "stop". Można tego sposobu używać gdy program jest "na szybko", ale jeśli chcesz zapewnić sobie odpowiednie zarządzanie zasobami, error handling, lepiej poświęcić trochę więcej czasu i zastosować inne wcześniej wymienione sposoby. Szczególnie jeśli planujesz obsługę myRIO, czy chociażby zapis do plików. Rzuć sobie okiem na templates-> continous measurements (bodajże).
Dołączę do tego tematu z moim problemem, ponieważ jest zbieżny.
Mmam kilka pętli działających równolegle i także chciałbym je zatrzymać jednym przyciskiem.
Zastosowałem Channel Writer -Tag:Write i Read.
Niestety jedna z pętli,w której jest Event Structure nie zatrzymuje po naciśnięciu stop. Zatrzymuje się ona dopiero po kolejnym naciśnieńciu klawiszy ja aktywujących.
Można to jakoś wyeliminować. Czy takie podejście jest poprawne.
W twoim przypadku najprościej dodać do Event structur Timeout, gdyż pętla while loop numer 3 działa tylko w przypadku "nienaciśnięcia klawiszy ją aktywujących" polecam zapoznanie się z kolegi kanałem na youtubie "Estymując" w odcinku "Kurs LabVIEW #6 - Struktura zdarzeniowa/Event structure" prezentuje działanie struktury zdarzeniowej.