Strona 1 z 1
kilka eventów dla tej samej kontrolki
: 10 cze 2010 15:22
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
Re: kilka eventów dla tej samej kontrolki
: 10 cze 2010 15:44
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.
Re: kilka eventów dla tej samej kontrolki
: 10 cze 2010 17:06
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...?
kilka eventów dla tej samej kontrolki
: 10 cze 2010 20:27
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?
Re: kilka eventów dla tej samej kontrolki
: 10 cze 2010 21:38
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.
Re: kilka eventów dla tej samej kontrolki
: 10 cze 2010 21:41
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...
Re: kilka eventów dla tej samej kontrolki
: 10 cze 2010 23:11
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:
Re: kilka eventów dla tej samej kontrolki
: 11 cze 2010 12:02
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
kilka eventów dla tej samej kontrolki
: 11 cze 2010 14:20
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
kilka eventów dla tej samej kontrolki
: 11 cze 2010 22:29
autor: m3wm3
Dzięki wszystkim za odpowiedzi, już wiem jak się z tym obchodzić