Terminologia
zdarzenie : rodzaj rzeczy, która może się zdarzyć.
odpalanie zdarzenia : konkretne wystąpienie zdarzenia; wydarzenie się dzieje.
detektor zdarzeń : Coś, co zwraca uwagę na wystrzeliwanie zdarzeń.
moduł obsługi zdarzeń : coś, co występuje, gdy detektor zdarzeń wykrywa uruchamianie zdarzenia.
subskrybent zdarzenia : odpowiedź, którą ma wywołać procedura obsługi zdarzenia.
Te definicje nie zależą od implementacji, dlatego można je realizować na różne sposoby.
Niektóre z tych terminów są często mylone z synonimami, ponieważ użytkownicy często nie muszą ich rozróżniać.
Typowe scenariusze
Programowanie zdarzeń logicznych.
Wydarzenie jest, gdy jakaś metoda jest wywoływana.
Wypalania zdarzenie jest szczególnym wezwaniem do tej metody.
Detektor zdarzeń jest haczyk w metodzie zdarzeń, który nazywa się na każdym odpaleniem zdarzenia, które wywołuje procedurę obsługi zdarzeń.
Moduł obsługi zdarzeń wywołuje kolekcję subskrybentów zdarzenia.
Abonent (a) wydarzenie wykonać wszelkie czynności (s) system oznacza wydarzy w odpowiedzi zaistnienia zdarzenia.
Wydarzenia zewnętrzne
Wydarzenie jest wydarzeniem zewnętrznym, które można wywieść z obserwabli.
Wypalania wydarzenie jest, gdy dzieje, że zewnętrzna może być uznane za mające miejsce.
Detektor zdarzeń jakoś wykrywa zapaleń zdarzeń, często przez odpytywanie obserwowalny (s), a następnie wywołuje procedurę obsługi zdarzenia po wykryciu zdarzenia wypalania.
Moduł obsługi zdarzeń wywołuje kolekcję subskrybentów zdarzenia.
Abonent (a) wydarzenie wykonać wszelkie czynności (s) system oznacza wydarzy w odpowiedzi zaistnienia zdarzenia.
Odpytywanie a wstawianie haków do mechanizmu strzelania zdarzenia
Chodzi o to, że sondaże często nie są konieczne. Wynika to z faktu, że detektory zdarzeń można wdrożyć przez automatyczne wyzwalanie zdarzeń, które jest wywoływane przez procedurę obsługi zdarzeń, co jest często najbardziej wydajnym sposobem implementacji rzeczy, gdy zdarzenia mają miejsce na poziomie systemu.
Analogicznie nie musisz codziennie sprawdzać skrzynki pocztowej, czy pracownik pocztowy puka do twoich drzwi i przekazuje pocztę bezpośrednio do ciebie.
Jednak nasłuchiwanie zdarzeń może również działać przez odpytywanie. Sondowanie niekoniecznie musi sprawdzać określoną wartość lub inną możliwą do zaobserwowania; może być bardziej skomplikowane. Ale ogólnie rzecz biorąc, celem odpytywania jest wnioskowanie, gdy wystąpiło jakieś zdarzenie, na które można zareagować.
Analogicznie, musisz sprawdzać swoją skrzynkę pocztową każdego dnia, gdy pracownik pocztowy po prostu wrzuca do niej pocztę. Nie musiałbyś wykonywać tej ankiety, gdybyś mógł poinstruować pracownika pocztowego, aby zapukał do twoich drzwi, ale często nie jest to możliwe.
Łańcuchowa logika zdarzeń
W wielu językach programowania możesz napisać zdarzenie, które jest wywoływane po naciśnięciu klawisza na klawiaturze lub w określonym czasie. Mimo że są to zdarzenia zewnętrzne, nie trzeba ich odpytywać. Dlaczego?
To dlatego, że system operacyjny odpytuje za ciebie. Na przykład system Windows sprawdza takie rzeczy, jak zmiany stanu klawiatury, a jeśli je wykryje, wywoła subskrybentów zdarzeń. Tak więc, gdy subskrybujesz wydarzenie związane z naciśnięciem klawisza, faktycznie subskrybujesz wydarzenie, które samo w sobie jest subskrybentem wydarzenia, które sonduje.
Analogicznie powiedzmy, że mieszkasz w kompleksie mieszkaniowym, a pracownik poczty wysyła pocztę do wspólnego obszaru odbioru poczty. Następnie pracownik podobny do systemu operacyjnego może sprawdzić tę pocztę dla wszystkich, dostarczając pocztę do mieszkań tych, którzy coś otrzymali. To oszczędza wszystkim innym kłopotów z koniecznością przeszukania obszaru odbioru poczty.
Moja intuicja zakłada, że detektor zdarzeń stale sprawdza, czy zdarzenie zostało uruchomione, co oznacza, że w moim scenariuszu nie będzie inaczej niż sprawdzanie każdej klatki, jeśli zdarzenie zostało uruchomione.
Na podstawie dyskusji w klasie wydaje się, że detektor zdarzeń działa w inny sposób.
Jak działa detektor zdarzeń?
Jak podejrzewasz, zdarzenie może działać poprzez odpytywanie. A jeśli zdarzenie jest w jakiś sposób powiązane z wydarzeniami zewnętrznymi, np. Naciśnięcie klawisza klawiatury, to w pewnym momencie musi nastąpić odpytywanie.
Jest również prawdą, że zdarzenia niekoniecznie muszą obejmować odpytywanie. Na przykład, jeśli zdarzenie ma miejsce po naciśnięciu przycisku, to detektor zdarzenia tego przycisku jest metodą, którą środowisko GUI może wywołać, gdy ustali, że kliknięcie myszą uderzy w przycisk. W tym przypadku nadal trzeba było przeprowadzić odpytywanie, aby można było wykryć kliknięcie myszą, ale detektor myszy jest bardziej pasywnym elementem połączonym z prymitywnym mechanizmem odpytywania poprzez łańcuch zdarzeń.
Aktualizacja: przy odpytywaniu sprzętu na niskim poziomie
Okazuje się, że urządzenia USB i inne nowoczesne protokoły komunikacyjne mają dość fascynujący, podobny do sieci zestaw protokołów interakcji, umożliwiając urządzeniom I / O, w tym klawiaturom i myszom, angażowanie się w topologie ad hoc .
Co ciekawe, „ zakłócenia ” są dość imperatywnymi, synchronicznymi rzeczami, więc nie obsługują topologii sieci ad hoc . Aby to naprawić, „ przerwań ” uogólniono w asynchroniczne pakiety o wysokim priorytecie zwane „ transakcjami przerwań ” (w kontekście USB) lub „ przerwańami sygnalizowanymi komunikatem ” (w kontekście PCI). Ten protokół jest opisany w specyfikacji USB:
- „ Rysunek 8-31. Maszyna stanu hosta transakcji luzem / kontrolą / przerwaniem OUT ” w „Specyfikacji uniwersalnej magistrali szeregowej, wersja 2.0” , wydrukowana strona-222; PDF-page-250 (2000-04-27)
Istotą wydaje się być to, że urządzenia I / O i komponenty komunikacyjne (takie jak koncentratory USB) w zasadzie działają jak urządzenia sieciowe. Wysyłają więc wiadomości, które wymagają odpytywania portów i tym podobnych. Zmniejsza to zapotrzebowanie na dedykowane linie sprzętowe.
Wydaje się, że systemy operacyjne, takie jak Windows, same obsługują proces odpytywania, np. Jak opisano w dokumentacji MSDN dla tych USB_ENDPOINT_DESCRIPTOR
, która opisuje, jak kontrolować, jak często Windows odpytuje kontroler hosta USB w poszukiwaniu komunikatów przerywających / izochronicznych:
bInterval
Wartość zawiera interwał sondowania dla przerwań i izochronicznych końcowych. W przypadku innych typów punktu końcowego tę wartość należy zignorować. Ta wartość odzwierciedla konfigurację urządzenia w oprogramowaniu układowym. Kierowcy nie mogą tego zmienić.
Interwał odpytywania wraz z prędkością urządzenia i typem kontrolera hosta określają częstotliwość, z jaką sterownik powinien inicjować przerwanie lub transfer izochroniczny. Wartość w bInterval
nie reprezentuje ustalonego czasu. Jest to wartość względna, a faktyczna częstotliwość odpytywania będzie również zależeć od tego, czy urządzenie i kontroler hosta USB działają z niską, pełną lub wysoką prędkością.
- „Struktura USB_ENDPOINT_DESCRIPTOR” , Hardware Dev Center, Microsoft
Nowsze protokoły połączeń monitora, takie jak DisplayPort, wydają się robić to samo:
Transport wielostrumieniowy (MST)
Slajd nr 14 z „Przeglądu DisplayPortTM wersja 1.2” (06.12.2010)
Ta abstrakcja pozwala na kilka ciekawych funkcji, takich jak uruchamianie 3 monitorów z jednego połączenia:
DisplayPort Multi-Stream Transport pozwala również na połączenie trzech lub więcej urządzeń razem, ale w odwrotnej, mniej zorientowanej na „konsumenta” konfiguracji: jednoczesne sterowanie wieloma wyświetlaczami z jednego portu wyjściowego.
- „DisplayPort” , Wikipedia
Pod względem koncepcyjnym należy oderwać się od tego, że mechanizmy odpytywania pozwalają na bardziej uogólnioną komunikację szeregową, co jest niesamowite, gdy potrzebujesz bardziej ogólnej funkcjonalności. Sprzęt i system operacyjny wykonują więc wiele sondowań dla systemu logicznego. Następnie klienci, którzy subskrybują wydarzenia, mogą cieszyć się szczegółami obsługiwanymi przez system niższego poziomu bez konieczności pisania własnych protokołów odpytywania / przekazywania wiadomości.
Ostatecznie zdarzenia takie jak naciśnięcia klawiszy wydają się przechodzić przez dość interesującą serię zdarzeń, zanim dotrą do imperatywnego mechanizmu wyzwalania zdarzeń na poziomie oprogramowania.