problem z event structure
- donelbaron
- Posty: 61
- Rejestracja: 07 sty 2009 23:17
- Kontakt:
problem z event structure
Witajce, mi juz ręce opadają, mam taki problem, chce po kliknięciu przycisku aby wykonał się fragment w tym event structure, ale całą pętła while zewnętrzna żęby ciągle chodziła, i tylko przy wywołaniu eventu ten fragment się wykonał, już nie wiem jak to zrobić. Jak zrobię jak na obrazku , while raz się wykona i czeka na eventa.
- Pitol
- Moderator
- Posty: 986
- Rejestracja: 19 lip 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Kraków
problem z event structure
hmm... bo event zasadniczo czeka na zdarzenie blokując pętlę, w której się znajduje. Jeśli chcesz żeby pozostała część pętli działała niezależnie od struktury event to stwórz dla niej oddzielną pętlę (a na przesyłanie między nimi danych jest parę patentów). No chyba że Ci sie nie chce to podepnij wejście Timeout w strukturze event (lewy górny róg) i obsłuż event Timeout... ale to jak Ci sie naprawdę nie chce ;)
Re: problem z event structure
Event jest na tyle zacnym tworem, że zasługuje na swoją własną pętlę While (czyli osobny wątek). Upychanie Event'a w jednej pętli While razem z innymi bloczkami jest bardzo złą praktyką i ogólnie psuje feng shui całego programu 

- donelbaron
- Posty: 61
- Rejestracja: 07 sty 2009 23:17
- Kontakt:
problem z event structure
no ale ja potzrebuje w tym evencie uzyć wartości z tablicy , to przecież nie przepnę miedzy whilami tablicy chyba że przez jakies loacal variable?
- donelbaron
- Posty: 61
- Rejestracja: 07 sty 2009 23:17
- Kontakt:
Re: problem z event structure
ok to przy okazji jeszcze takie pytanko , czym się rózni zmienna localna od kontrolki od jej property noda "value" ?
- Pitol
- Moderator
- Posty: 986
- Rejestracja: 19 lip 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Kraków
problem z event structure
gdzies, ktoś, kiedyś mądry mi powiedział, że prop. node to zło, którego należy unikać jak ognia
a tak poważniej to tutaj (http://www.labview.pl/viewtopic.php?f=11&t=2695) była dyskusja o tym co, kiedy i dlaczego.

Ostatnio zmieniony 15 mar 2010 21:41 przez Pitol, łącznie zmieniany 2 razy.
- donelbaron
- Posty: 61
- Rejestracja: 07 sty 2009 23:17
- Kontakt:
Re: problem z event structure
OK, zrobiłem coś takiego, w zależnosci od eventu zmieniam sobie numercia na podstawie którego potem robie albo jeden albo drugi case, i to nie działą, przy odpaleniu eventu wszytko zwisa. mało tego nie zmienia wcale event tego numerica.
- Pitol
- Moderator
- Posty: 986
- Rejestracja: 19 lip 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Kraków
Re: problem z event structure
w obrazku w pierwszym Twoim poście byłoby wszystko ok, gdybyś tylko wyjął event do innej pętli i podłączył local var. Mniej więcej tak
a swoją drogą to odliczanie czasu w pętli z eventem jest niepotrzebne.
Ostatnio zmieniony 15 mar 2010 22:28 przez Pitol, łącznie zmieniany 3 razy.
- donelbaron
- Posty: 61
- Rejestracja: 07 sty 2009 23:17
- Kontakt:
Re: problem z event structure
ok jednak działa, nie wiem dlaczego ale zaczęło jak wywalilem z tej pętli do obsługi eventu ten timeout
- smiga
- Administrator
- Posty: 823
- Rejestracja: 04 paź 2009 12:41
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Słupsk
Re: problem z event structure
Po wstawieniu Wait Until Next ms Multiple Function działa to następująco:
Struktura Event obsługuje zdarzenia (przerwania od klawiatury, myszki itd). Zdarzenia są kolejkowane i przychodzą kolejno jedno za drugim (gdy procesor nie obsługuje akurat wątków o wyższym priorytecie). Jeżeli nie ustawimy terminala Timeout to struktura Event nie zajmuje czasu procesorowi. Gdy ustawimy Timeout na wartość większą od zera to w Case'ie Timeout możemy obsłużyć coś co się wydarzy gdy nie przyszło żadne zdarzenie - np. pojawienie się dymka "obudź się i wciśnij jakiś klawisz" co 10s (timeout= 10000). Działanie takiej pętli jest proste - program wchodzi do pętli while, tam napotyka Event, jeżeli przyjdzie zdarzenie to je obsłuży (odpowiedni Case w Event) i znowu wyjdzie do While, a że w While jest Event to znowu będzie czekał na zdarzenie; jeżeli będzie czekał powyżej przykładowych 10s to wykona to co jest w Case'ie Timeout i wyjdzie do While by wrócić znowu do obsługi Event i tak w kółko -co ważne jeżeli nie przychodzą żadne zdarzenie to nie zajmuje czasu procesora przez wspomniane 10s, budzi się na chwilę żeby obsłużyć to co jest w Timeout (dymek) i znowu "śpi" przez 10s.
W momencie kiedy do pętli While wstawiłeś opóźnienie czasowe skomplikowałeś obsługę zdarzeń. Działało to wtedy tak: załóżmy, że kliknąłeś 3 raz jakiś przycisk na panelu frontowym w celu zmiany jego wartości. Pierwsze kliknięcie (zdarzenie) zostanie obsłużone od razu przez strukturę Event, a następnie zostaje ona opuszczona i program przechodzi do wykonania pętli While, gdzie napotyka Wait... i czeka 1s, po czym wraca do obsługi zdarzeń Ebvet'a, a tam dwa w kolejce, więc bierze kolejne, obsługuje odpowiednim Case'em i znowu trafia na Wait w pętli While ... i znowu czeka 1s zamiast obsłużyć 3 kliknięcie w przycisk ... i tak dalej.
mam nadzieję, że w miarę jasno to opisałem i pomogłem w zrozumieniu problemu
Struktura Event obsługuje zdarzenia (przerwania od klawiatury, myszki itd). Zdarzenia są kolejkowane i przychodzą kolejno jedno za drugim (gdy procesor nie obsługuje akurat wątków o wyższym priorytecie). Jeżeli nie ustawimy terminala Timeout to struktura Event nie zajmuje czasu procesorowi. Gdy ustawimy Timeout na wartość większą od zera to w Case'ie Timeout możemy obsłużyć coś co się wydarzy gdy nie przyszło żadne zdarzenie - np. pojawienie się dymka "obudź się i wciśnij jakiś klawisz" co 10s (timeout= 10000). Działanie takiej pętli jest proste - program wchodzi do pętli while, tam napotyka Event, jeżeli przyjdzie zdarzenie to je obsłuży (odpowiedni Case w Event) i znowu wyjdzie do While, a że w While jest Event to znowu będzie czekał na zdarzenie; jeżeli będzie czekał powyżej przykładowych 10s to wykona to co jest w Case'ie Timeout i wyjdzie do While by wrócić znowu do obsługi Event i tak w kółko -co ważne jeżeli nie przychodzą żadne zdarzenie to nie zajmuje czasu procesora przez wspomniane 10s, budzi się na chwilę żeby obsłużyć to co jest w Timeout (dymek) i znowu "śpi" przez 10s.
W momencie kiedy do pętli While wstawiłeś opóźnienie czasowe skomplikowałeś obsługę zdarzeń. Działało to wtedy tak: załóżmy, że kliknąłeś 3 raz jakiś przycisk na panelu frontowym w celu zmiany jego wartości. Pierwsze kliknięcie (zdarzenie) zostanie obsłużone od razu przez strukturę Event, a następnie zostaje ona opuszczona i program przechodzi do wykonania pętli While, gdzie napotyka Wait... i czeka 1s, po czym wraca do obsługi zdarzeń Ebvet'a, a tam dwa w kolejce, więc bierze kolejne, obsługuje odpowiednim Case'em i znowu trafia na Wait w pętli While ... i znowu czeka 1s zamiast obsłużyć 3 kliknięcie w przycisk ... i tak dalej.
mam nadzieję, że w miarę jasno to opisałem i pomogłem w zrozumieniu problemu
