kilka eventów dla tej samej kontrolki

Tematy związane z tworzeniem dużych aplikacji. Zaganiednia dotyczące architektury oraz zasad tworzenia optymalnych rozwiązań.
Awatar użytkownika
m3wm3
Posty: 22
Rejestracja: 10 gru 2009 22:33
Wersja środowiska: LabVIEW 8.6

kilka eventów dla tej samej kontrolki

Post autor: m3wm3 »

Witam po raz kolejny, tym razem mam pytanko dotyczące Event Structure.

W pewnym miejscu programu (dosyć głęboko zagnieżdżonym) mam pętlę While, a w niej Event Structure z:

- image: mouse down (wyświetlanie klikniętych współrzędnych),
- image: mouse move (monitor aktualnych współrzędnych) oraz
- button: value change (zapisuje współrzędne kliknięte do tablicy i kończy pętlę).

Kontrolki te znajdują się na zakładce 2 z 3.

Ta pętelka znajduje się w Stacked Structure (we frejmie 3 z 4), który też jest w pętli. Wszystko działa jak należy dopóki w dalszej części programu (kilka poziomów i pętel wyżej) nie wstawię dokładnie takiej samej Event Structure dla takich samych kontrolek.

W dalszym miejscu programu (kilka poziomów wyżej) chciałbym robić dokładnie to samo, więc skopiowałem pętelkę z Event Structure. Lekko się zdziwiłem, bo program wiesza się przy rejestracji pierwszego ruchu myszki po image-u już podczas tego pierwszego użycia Event Structure. Moje pytanie brzmi: nie można w różnych miejscach programu wywoływać takich samych eventów dla takich samych kontrolek? Czy może jednak powinienem upatrywać błędu gdzie indziej?

Aha, dodam, że jeśli skopiuję całą zakładkę, a więc nazwy kontrolek się zmienią - wszystko działa jak należy...

Z góry dzięki za pomoc :)
Awatar użytkownika
smiga
Administrator
Posty: 800
Rejestracja: 04 paź 2009 12:41
Wersja środowiska: LabVIEW 2016
Lokalizacja: Słupsk

Re: kilka eventów dla tej samej kontrolki

Post autor: smiga »

Pętla "event" służy do obsługi przerwań pochodzących od interfejsu użytkownika (myszka, klawisze). Jeżeli zastosujesz dwie pętle "event" i to jeszcze obsługujące te same kontrolki, to system "nie wie co ma zrobić".
Poczytaj o "Producer/Consumer Design Pattern (Events)" - dostępne z File New...

Jak załączysz swój kod będzie łatwiej pomóc.
__ Arkadiusz Śmigielski, tel. 662 01 01 74___
ObrazekObrazekObrazek
Awatar użytkownika
smiga
Administrator
Posty: 800
Rejestracja: 04 paź 2009 12:41
Wersja środowiska: LabVIEW 2016
Lokalizacja: Słupsk

Re: kilka eventów dla tej samej kontrolki

Post autor: smiga »

Ciekawe, przetestowałem sobie taki układ dwóch struktur event obsługujących zmianę wartości tej samej kontrolki, w 2 kombinacjach: w tej samej pętli while lub 2 równoległych pętlach while ... i w obu przypadkach program działał :-\ (oczywiście bez gwarancji, która wykonała się pierwsza).

Może któryś z Kolegów z większym doświadczeniem podpowie czy ma to gdzieś zastosowanie, bo ja się nie spotkałem z taką architekturą programu, wykorzystującą 2 event'y.
Co prawdą na ostatnim szkoleniu w NI (szkole z Object Oriented Programming) któryś z Kolegów poruszał ten temat, ale wypadło mi z głowy do czego to było wykorzystywane :-? ... może przypomni...?
__ Arkadiusz Śmigielski, tel. 662 01 01 74___
ObrazekObrazekObrazek
Awatar użytkownika
m3wm3
Posty: 22
Rejestracja: 10 gru 2009 22:33
Wersja środowiska: LabVIEW 8.6

kilka eventów dla tej samej kontrolki

Post autor: m3wm3 »

Dzięki za odpowiedź.

Problem w tym, że te struktury Event nie są ani w jednej pętli, ani w dwóch 'obok siebie'. One są w bardzo różnych częściach programu, w dodatku przy sprzyjających warunkach żadna może się w ogóle nie wykonać. Zawsze myślałem, że system patrzy na to gdzie jest i wykonuje to co teraz ma 'przed sobą', a nie patrzy co będzie później... Czy jednak jest inaczej?
Awatar użytkownika
jogurt_owocowy
Posty: 1317
Rejestracja: 30 lis 2004 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków

Re: kilka eventów dla tej samej kontrolki

Post autor: jogurt_owocowy »

m3wm3 pisze:Zawsze myślałem, że system patrzy na to gdzie jest i wykonuje to co teraz ma 'przed sobą', a nie patrzy co będzie później... Czy jednak jest inaczej?
Program wykonuje się zgodnie z paradygmatami dataflow: dane przypływają do wejść bloku programu (funkcji, struktury, ...), gdy wszystkie wejścia dostaną dane, blok się wykonuje i po wykonaniu zwraca wyniki. Nie wiem, co więcej można by tu napisać. Na podstawie Twojego opisu, bez wglądu w program, nie da się stwierdzić, co konkretnie jest problemem.
m3wm3 pisze:Problem w tym, że te struktury Event nie są ani w jednej pętli, ani w dwóch 'obok siebie'.
Nawet jeśli są fantazyjnie wplecione w program, to muszą się znajdować albo w jednej pętli, albo w dwóch równoległych (albo jedno i drugie).
Gdzie by nie były, taka radosna twórczość w przypadku eventów jest szczególnie niebezpieczna i prowadzi na manowce. Całkiem dobrym uproszczonym zaleceniem może być: jedna pętla, a wewnątrz niej bezpośrednio struktura event. Bardziej szczegółowych zaleceń jest więcej i możesz o nich poczytać tutaj. Zwróć uwagę na Avoid placing two Event structures in one loop.
Awatar użytkownika
skoziate
Administrator
Posty: 245
Rejestracja: 06 mar 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Warszawa
Kontakt:

Re: kilka eventów dla tej samej kontrolki

Post autor: skoziate »

Events, czyli zdarzenia, są kolejkowane przez system operacyjny. Jak wiadomo struktura Event obsługuje te zdarzenia, na które została zaprogramowana. Jeżeli w systemie wystąpi dane zdarzenie i w programie znajdują się dwie struktury Event obsługujące to samo zdarzenie, to jedna z nich zareaguje pierwsza. Normalnie to nie wiadomo, która zareaguje pierwsza, ale wiadomo, że jeśli jedna z nich obsłuży zdarzenie, to druga już go nie zauważy, bo zniknie z kolejki.

Wybacznie zdania wielokrotnie złożone...
Pozdrawiam,
Sebastian
Awatar użytkownika
smiga
Administrator
Posty: 800
Rejestracja: 04 paź 2009 12:41
Wersja środowiska: LabVIEW 2016
Lokalizacja: Słupsk

Re: kilka eventów dla tej samej kontrolki

Post autor: smiga »

skoziate pisze: Normalnie to nie wiadomo, która zareaguje pierwsza, ale wiadomo, że jeśli jedna z nich obsłuży zdarzenie, to druga już go nie zauważy, bo zniknie z kolejki.
No właśnie z praktyki wynika, że obie struktury obsłużą to zdarzenie ... czyli to kolejkowanie zdarzeń LV jakoś inaczej obsługuje.
Problem wystąpi natomiast jeżeli zatrzymamy jedną pętlę - wtedy LV "głupieje"
Przykład takiego kodu poniżej:
Załączniki
events.vi
(10.28 KiB) Pobrany 444 razy
__ Arkadiusz Śmigielski, tel. 662 01 01 74___
ObrazekObrazekObrazek
PMaj
Posty: 231
Rejestracja: 04 sty 2004 00:00

Re: kilka eventów dla tej samej kontrolki

Post autor: PMaj »

Witam,

Dołączę się do dyskusji,

Struktura Event rezerwuje dostęp do zdarzeń (jest rejestrowana) w momencie włączenia programu zawierającego strukturę zdarzeń. Wszystkie zdarzenia przed i wejściem po wyjściu z tej struktury są rejestrowane i kolejkowane dla każdej struktury osobno, jednak do obsługi kolejnego zdarzenia można przejść dopiero w momencie zakończenia obsługi obecnego (przez wszystkie struktury obsługujące to zdarzenie). Niestety - samo zatrzymanie pętli WHILE zawierającego jedną strukturę zdarzeń nie rozwiąże problemu, ponieważ struktura EVENT jest unreserved dopiero w momencie zakończenia działania całego programu (VIa), a nie jego części.

Osobiście jestem zwolennikiem używania jednej tylko struktury EVENT w całym projekcie - w podprogramie UserInterface.

Pozdrawiam
P
Nie jestem leniwy
Mam zawyżone wymagania motywacyjne
Awatar użytkownika
Nowszy
Posty: 504
Rejestracja: 30 maja 2008 08:33
Wersja środowiska: LabVIEW 2011
Lokalizacja: Katowice
Kontakt:

kilka eventów dla tej samej kontrolki

Post autor: Nowszy »

No proszę, ja też tego nie wiedziałem, pomyslałbym tak jak skoziate. Najprościej sprawdzić jak to działa, wstawiając do jednej z pętli w przykładzie Smiga (Smigi?) opoznienie do jednej z Event Structures - będzie ono działało na obie pętle :D
Pozdrawiam, Maciek Antonik
Edu4Industry
Awatar użytkownika
m3wm3
Posty: 22
Rejestracja: 10 gru 2009 22:33
Wersja środowiska: LabVIEW 8.6

kilka eventów dla tej samej kontrolki

Post autor: m3wm3 »

Dzięki wszystkim za odpowiedzi, już wiem jak się z tym obchodzić :)
ODPOWIEDZ