Zatrzymywanie kilku równoległych pętli while

Tematy związane z tworzeniem dużych aplikacji. Zaganiednia dotyczące architektury oraz zasad tworzenia optymalnych rozwiązań.
PrzemB
Posty: 38
Rejestracja: 24 mar 2015 18:42
Wersja środowiska: LabVIEW 2017

Zatrzymywanie kilku równoległych pętli while

Post autor: PrzemB »

Witam,

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 :)

Pozdrawiam
Przemek
Awatar użytkownika
semper fidelis
Posty: 74
Rejestracja: 28 paź 2014 20:45
Wersja środowiska: LabVIEW 2013

Zatrzymywanie kilku równoległych pętli while

Post autor: semper fidelis »

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...
pawhan11
Posty: 67
Rejestracja: 21 wrz 2011 16:25
Wersja środowiska: LabVIEW 2012

Re: Zatrzymywanie kilku równoległych pętli while

Post autor: pawhan11 »

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.
CLS - Certified LabVIEW Student
Awatar użytkownika
Pitol
Moderator
Posty: 982
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

Zatrzymywanie kilku równoległych pętli while

Post autor: Pitol »

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.
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
PrzemB
Posty: 38
Rejestracja: 24 mar 2015 18:42
Wersja środowiska: LabVIEW 2017

Re: Zatrzymywanie kilku równoległych pętli while

Post autor: PrzemB »

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.

Pozdrawiam
Przemek
MK_Zuk
Posty: 83
Rejestracja: 01 gru 2009 11:53
Wersja środowiska: LabVIEW 2014

Re: Zatrzymywanie kilku równoległych pętli while

Post autor: MK_Zuk »

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.

Pozdrawiam
MK_Zuk
Awatar użytkownika
aaddaas
Posty: 202
Rejestracja: 26 cze 2013 20:42
Wersja środowiska: LabVIEW 2015

Re: Zatrzymywanie kilku równoległych pętli while

Post autor: aaddaas »

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).
Obrazek
PrzemB
Posty: 38
Rejestracja: 24 mar 2015 18:42
Wersja środowiska: LabVIEW 2017

Re: Zatrzymywanie kilku równoległych pętli while

Post autor: PrzemB »

Zrobiłem jedną kolejkę do przesyłania informacji "krytycznych" - m.in. stop silników, czy właśnie zatrzymanie aplikacji. Wszystko działa super.

Pozdrawiam
Przemek
konos513
Posty: 6
Rejestracja: 23 gru 2020 22:33
Wersja środowiska: LabVIEW 2018

Re: Zatrzymywanie kilku równoległych pętli while

Post autor: konos513 »

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.
Załączniki
a.png
kolor_rownoloegle_petle1.vi
(34.14 KiB) Pobrany 95 razy
MateZdun
Posty: 2
Rejestracja: 13 cze 2021 16:14
Wersja środowiska: LabVIEW 2018

Re: Zatrzymywanie kilku równoległych pętli while

Post autor: MateZdun »

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.
Awatar użytkownika
smiga
Administrator
Posty: 799
Rejestracja: 04 paź 2009 12:41
Wersja środowiska: LabVIEW 2016
Lokalizacja: Słupsk

Re: Zatrzymywanie kilku równoległych pętli while

Post autor: smiga »

Stop powinien być w Event'cie.
BTW, posprzątaj te zakręcone druty, proszę :)
__ Arkadiusz Śmigielski, tel. 662 01 01 74___
ObrazekObrazekObrazek
konos513
Posty: 6
Rejestracja: 23 gru 2020 22:33
Wersja środowiska: LabVIEW 2018

Re: Zatrzymywanie kilku równoległych pętli while

Post autor: konos513 »

Dziękuję za komentarze,
Stop w Event'cie pomógł.
Zastosowanie Timeout-u w Event'cie nie zadziałał, prawdopodobnie z brakach w mojej wiedzy.
Załączniki
stop.png
Awatar użytkownika
smiga
Administrator
Posty: 799
Rejestracja: 04 paź 2009 12:41
Wersja środowiska: LabVIEW 2016
Lokalizacja: Słupsk

Re: Zatrzymywanie kilku równoległych pętli while

Post autor: smiga »

Jak masz stop w event'cie, nie potrzebujesz timeout'u...w Twoim przypadku :)
logo_Bitfold3.png
logo_Bitfold3.png (6.06 KiB) Przejrzano 1647 razy
__ Arkadiusz Śmigielski, tel. 662 01 01 74___
ObrazekObrazekObrazek
ODPOWIEDZ