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
Has thanked: 3 times

Zatrzymywanie kilku równoległych pętli while

Post autor: PrzemB » 17 paź 2015 17:13

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 » 17 paź 2015 18:51

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: 65
Rejestracja: 21 wrz 2011 16:25
Wersja środowiska: LabVIEW 2012
Been thanked: 1 time

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

Post autor: pawhan11 » 18 paź 2015 22:46

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: 965
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków
Has thanked: 4 times
Been thanked: 9 times

Zatrzymywanie kilku równoległych pętli while

Post autor: Pitol » 19 paź 2015 08:16

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
Has thanked: 3 times

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

Post autor: PrzemB » 19 paź 2015 08:34

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
Has thanked: 1 time
Been thanked: 1 time

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

Post autor: MK_Zuk » 19 paź 2015 16:03

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: 197
Rejestracja: 26 cze 2013 20:42
Wersja środowiska: LabVIEW 2015
Has thanked: 1 time

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

Post autor: aaddaas » 21 paź 2015 12:35

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
Has thanked: 3 times

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

Post autor: PrzemB » 01 lis 2015 19:28

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 » 22 mar 2022 11:50

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 44 razy

MateZdun
Posty: 1
Rejestracja: 13 cze 2021 16:14
Wersja środowiska: LabVIEW 2018

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

Post autor: MateZdun » 23 mar 2022 08:13

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: 776
Rejestracja: 04 paź 2009 12:41
Wersja środowiska: LabVIEW 2016
Lokalizacja: Słupsk
Has thanked: 7 times
Been thanked: 14 times
Kontakt:

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

Post autor: smiga » 23 mar 2022 08:25

Stop powinien być w Event'cie.
BTW, posprzątaj te zakręcone druty, proszę :)
__ Arkadiusz Śmigielski, tel. 662 01 01 74___
ObrazekObrazekObrazekObrazek

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 » 24 mar 2022 13:28

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: 776
Rejestracja: 04 paź 2009 12:41
Wersja środowiska: LabVIEW 2016
Lokalizacja: Słupsk
Has thanked: 7 times
Been thanked: 14 times
Kontakt:

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

Post autor: smiga » 27 mar 2022 01:16

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

ODPOWIEDZ