Terminologia
evento : un tipo di cosa che può accadere.
attivazione di eventi : una specifica occorrenza di un evento; un evento sta accadendo.
listener di eventi : qualcosa che cerca gli eventi.
gestore eventi : qualcosa che si verifica quando un listener di eventi rileva un evento in corso.
abbonato all'evento : una risposta che il gestore dell'evento dovrebbe chiamare.
Queste definizioni non dipendono dall'implementazione, quindi possono essere implementate in diversi modi.
Alcuni di questi termini sono comunemente scambiati per sinonimi poiché spesso non è necessario che gli utenti li distinguano.
Scenari comuni
Eventi logici di programmazione.
L' evento è quando viene chiamato un metodo.
L'attivazione di un evento è una chiamata particolare a quel metodo.
Il listener di eventi è un hook nel metodo dell'evento che viene chiamato su ogni attivazione di eventi che chiama il gestore eventi.
Il gestore eventi chiama una raccolta di abbonati evento.
L' abbonato / gli eventi esegue qualsiasi azione (i) del sistema intende accadere in risposta al verificarsi dell'evento.
Eventi esterni.
L' evento è un avvenimento esterno che può essere dedotto da osservabili.
L'attivazione di un evento è quando si può riconoscere che si è verificato quell'evento esterno.
L' ascoltatore di eventi in qualche modo rileva gli attivamenti degli eventi, spesso eseguendo il polling degli osservabili, quindi chiama il gestore dell'evento quando rileva un innesco dell'evento.
Il gestore eventi chiama una raccolta di abbonati evento.
L' abbonato / gli eventi esegue qualsiasi azione (i) del sistema intende accadere in risposta al verificarsi dell'evento.
Polling vs. inserimento di ganci nel meccanismo di fuoco dell'evento
Il punto sollevato da altri è che il polling spesso non è necessario. Questo perché i listener di eventi possono essere implementati facendo in modo che gli attivamenti degli eventi chiamino automaticamente il gestore eventi, che è spesso il modo più efficiente di implementare le cose quando gli eventi sono occorrenze a livello di sistema.
Per analogia, non è necessario controllare la posta ogni giorno per la posta se l'operatore postale bussa alla tua porta e ti consegna la posta direttamente a te.
Tuttavia, i listener di eventi possono funzionare anche tramite polling. Il polling non deve necessariamente verificare un valore specifico o altro osservabile; può essere più complesso. Ma, nel complesso, il punto del polling è dedurre quando si è verificato un evento in modo tale da poter rispondere.
Per analogia, devi controllare la tua casella di posta ogni giorno quando l'operatore postale vi lascia la posta. Non dovresti fare questo sondaggio se potessi dare istruzioni al lavoratore postale di bussare alla tua porta, ma spesso non è una possibilità.
Logica degli eventi concatenati
In molti linguaggi di programmazione, è possibile scrivere un evento che viene appena chiamato quando viene premuto un tasto sulla tastiera o in un determinato momento. Sebbene questi siano eventi esterni, non è necessario effettuare il polling per essi. Perché?
È perché il sistema operativo sta eseguendo il polling per te. Ad esempio, Windows controlla cose come i cambiamenti di stato della tastiera e, se ne rileva uno, chiamerà gli abbonati agli eventi. Quindi, quando ti iscrivi a un evento di stampa da tastiera, ti stai effettivamente iscrivendo a un evento che è esso stesso un abbonato a un evento che esegue il polling.
Per analogia, supponiamo che tu stia vivendo in un complesso di appartamenti e che un impiegato delle poste lasci la posta in un'area di ricevimento postale comune. Quindi, un lavoratore simile al sistema operativo può controllare la posta per tutti, consegnando la posta agli appartamenti di coloro che hanno ricevuto qualcosa. Questo risparmia a tutti gli altri il problema di dover effettuare il polling dell'area di ricezione della posta.
La mia intuizione supponeva che l'ascoltatore di eventi controlla costantemente se l'evento è stato generato, il che significa che, nel mio scenario, non sarebbe diverso dal controllare ogni frame se l'evento è stato generato.
Sulla base della discussione in classe, sembra che l'ascoltatore di eventi funzioni in modo diverso.
Come funziona un listener di eventi?
Come sospetti, un evento può funzionare tramite polling. E se un evento è in qualche modo correlato a eventi esterni, ad esempio la pressione di un tasto della tastiera, a un certo punto il polling deve avvenire.
È anche vero che gli eventi non devono necessariamente comportare il polling. Ad esempio, se l'evento è quando viene premuto un pulsante, il listener di eventi di quel pulsante è un metodo che il framework GUI potrebbe chiamare quando determina che un clic del mouse colpisce il pulsante. In questo caso, il polling doveva ancora avvenire per rilevare il clic del mouse, ma l'ascoltatore del mouse è un elemento più passivo collegato al meccanismo di polling primitivo attraverso il concatenamento di eventi.
Aggiornamento: su polling hardware di basso livello
Si scopre che i dispositivi USB e altri protocolli di comunicazione moderni hanno una serie piuttosto affascinante di protocolli di interazione simili a reti, che consentono ai dispositivi I / O di tastiere e mouse di impegnarsi in topologie ad hoc .
È interessante notare che gli " interrupt " sono cose imperative e sincrone, quindi non gestiscono topologie di rete ad hoc . Per risolvere questo problema, gli " interrupt " sono stati generalizzati in pacchetti asincroni ad alta priorità chiamati " transazioni di interrupt " (nel contesto di USB) o " interrupt segnalati da messaggi " (nel contesto di PCI). Questo protocollo è descritto in una specifica USB:
- " Figura 8-31. Bulk / Control / Interrupt OUT Transaction Host State Machine " in "Specifica bus seriale universale, revisione 2.0" , pagina 222 stampata; PDF-page-250 (2000-04-27)
L'essenza sembra essere che i dispositivi I / O e i componenti di comunicazione (come hub USB) agiscano sostanzialmente come dispositivi di rete. Quindi, inviano messaggi, il che richiede il polling delle loro porte e così via. Questo allevia la necessità di linee hardware dedicate.
Sistemi operativi come Windows sembrano gestire la procedura di polling in sé, ad esempio come descritto nella documentazione MSDN per la USB_ENDPOINT_DESCRIPTOR
's che descrive come controllare la frequenza di Windows sondaggi un controller host USB per i messaggi di interrupt / isocrono:
Il bInterval
valore contiene l'intervallo di polling per gli interrupt e gli endpoint isocroni. Per altri tipi di endpoint, questo valore deve essere ignorato. Questo valore riflette la configurazione del dispositivo nel firmware. I driver non possono cambiarlo.
L'intervallo di polling, insieme alla velocità del dispositivo e al tipo di controller host, determinano la frequenza con cui il conducente dovrebbe avviare un interrupt o un trasferimento isocrono. Il valore in bInterval
non rappresenta un periodo di tempo fisso. È un valore relativo e la frequenza di polling effettiva dipenderà anche dal fatto che il dispositivo e il controller host USB funzionino a bassa, piena o alta velocità.
- "USB_ENDPOINT_DESCRIPTOR struttura" , Hardware Dev Center, Microsoft
I protocolli di connessione del monitor più recenti come DisplayPort sembrano fare lo stesso:
Trasporto multi-stream (MST)
-Slide # 14 da "Panoramica DisplayPortTM Ver.1.2" (06-12-2010)
Questa astrazione consente alcune funzioni pulite, come l'esecuzione di 3 monitor da una connessione:
DisplayPort Multi-Stream Transport consente inoltre di collegare tre o più dispositivi insieme, ma nella configurazione opposta, meno orientata al consumatore: guida simultaneamente più display da una singola porta di uscita.
- "DisplayPort" , Wikipedia
Concettualmente, il punto da togliere a questo è che i meccanismi di polling consentono comunicazioni seriali più generalizzate, il che è fantastico quando si desidera funzionalità più generali. Quindi, l'hardware e il sistema operativo eseguono molti polling per il sistema logico. Quindi, i consumatori che si iscrivono agli eventi possono godere di quei dettagli gestiti per loro dal sistema di livello inferiore, senza dover scrivere i propri protocolli di polling / passaggio messaggi.
Alla fine, eventi come la pressione dei tasti sembrano passare attraverso una serie piuttosto interessante di eventi prima di arrivare al meccanismo imperativo di attivazione del livello software.