Zatrzymywanie kilku równoległych pętli while
Zatrzymywanie kilku równoległych pętli while
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
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
- semper fidelis
- Posty: 74
- Rejestracja: 28 paź 2014 20:45
- Wersja środowiska: LabVIEW 2013
Zatrzymywanie kilku równoległych pętli while
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...
Re: Zatrzymywanie kilku równoległych pętli while
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.
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
- 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
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.
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.
Re: Zatrzymywanie kilku równoległych pętli while
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
Pozdrawiam
Przemek
Re: Zatrzymywanie kilku równoległych pętli while
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
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
Re: Zatrzymywanie kilku równoległych pętli while
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).
Re: Zatrzymywanie kilku równoległych pętli while
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
Pozdrawiam
Przemek
Re: Zatrzymywanie kilku równoległych pętli while
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.
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
-
- kolor_rownoloegle_petle1.vi
- (34.14 KiB) Pobrany 99 razy
Re: Zatrzymywanie kilku równoległych pętli while
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.
- smiga
- Administrator
- Posty: 800
- Rejestracja: 04 paź 2009 12:41
- Wersja środowiska: LabVIEW 2016
- Lokalizacja: Słupsk
Re: Zatrzymywanie kilku równoległych pętli while
Stop powinien być w Event'cie.
BTW, posprzątaj te zakręcone druty, proszę
BTW, posprzątaj te zakręcone druty, proszę
Re: Zatrzymywanie kilku równoległych pętli while
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.
Stop w Event'cie pomógł.
Zastosowanie Timeout-u w Event'cie nie zadziałał, prawdopodobnie z brakach w mojej wiedzy.
- smiga
- Administrator
- Posty: 800
- Rejestracja: 04 paź 2009 12:41
- Wersja środowiska: LabVIEW 2016
- Lokalizacja: Słupsk
Re: Zatrzymywanie kilku równoległych pętli while
Jak masz stop w event'cie, nie potrzebujesz timeout'u...w Twoim przypadku