Terminologia
evento : um tipo de coisa que pode acontecer.
disparo de evento : uma ocorrência específica de um evento; um evento acontecendo.
ouvinte de evento : algo que atenta para acionamentos de eventos.
manipulador de eventos : algo que ocorre quando um ouvinte de eventos detecta um disparo de evento.
assinante de evento : uma resposta que o manipulador de eventos deveria chamar.
Essas definições não dependem da implementação, portanto podem ser implementadas de maneiras diferentes.
Alguns desses termos geralmente são confundidos com sinônimos, pois muitas vezes não é necessário que os usuários façam distinção entre eles.
Cenários comuns
Eventos de lógica de programação.
O evento é quando algum método é chamado.
Um disparo de evento é uma chamada específica para esse método.
O ouvinte de evento é um gancho no método de evento chamado em cada disparo de evento que chama o manipulador de eventos.
O manipulador de eventos chama uma coleção de assinantes de eventos.
O (s) assinante (s) do evento executam todas as ações que o sistema pretende que aconteçam em resposta à ocorrência do evento.
Eventos externos.
O evento é um acontecimento externo que pode ser inferido a partir de observáveis.
Um disparo de evento é quando esse acontecimento externo pode ser reconhecido como tendo ocorrido.
O ouvinte de eventos de alguma forma detecta disparos de eventos, geralmente pesquisando os observáveis, e então chama o manipulador de eventos ao detectar um disparo de evento.
O manipulador de eventos chama uma coleção de assinantes de eventos.
O (s) assinante (s) do evento executam todas as ações que o sistema pretende que aconteçam em resposta à ocorrência do evento.
Pesquisa versus inserção de ganchos no mecanismo de disparo do evento
O argumento de outras pessoas é que as pesquisas geralmente não são necessárias. Isso ocorre porque os ouvintes de eventos podem ser implementados fazendo com que os acionamentos de eventos chamem automaticamente o manipulador de eventos, que geralmente é a maneira mais eficiente de implementar coisas quando os eventos são ocorrências no nível do sistema.
Por analogia, você não precisa verificar a caixa de correio todos os dias se o funcionário bater à sua porta e entregar a correspondência diretamente a você.
No entanto, os ouvintes de eventos também podem trabalhar pesquisando. A pesquisa não precisa necessariamente verificar um valor específico ou outro observável; pode ser mais complexo. Mas, em geral, o objetivo da pesquisa é inferir quando algum evento ocorreu, para que possa ser respondido.
Por analogia, você deve verificar sua caixa de correio todos os dias quando o funcionário dos correios simplesmente solta a correspondência nela. Você não precisaria fazer esse trabalho de votação se pudesse instruir o funcionário a bater à sua porta, mas isso geralmente não é uma possibilidade.
Encadeando a lógica do evento
Em muitas linguagens de programação, você pode escrever um evento chamado apenas quando uma tecla do teclado é pressionada ou em um determinado momento. Embora sejam eventos externos, você não precisa fazer uma pesquisa para eles. Por quê?
É porque o sistema operacional está pesquisando para você. Por exemplo, o Windows verifica itens como alterações de estado do teclado e, se detectar um, chama os assinantes do evento. Portanto, quando você se inscreve em um evento de pressionamento de teclado, na verdade está se inscrevendo em um evento que é ele próprio um assinante de um evento que é pesquisado.
Por analogia, diga que você está morando em um complexo de apartamentos e um funcionário dos correios envia as cartas para uma área de recebimento de correspondência. Em seguida, um trabalhador do tipo sistema operacional pode verificar se há correio para todos, entregando correio nos apartamentos daqueles que receberam algo. Isso poupa a todos os demais de ter que pesquisar a área de recebimento de correio.
Minha intuição presumiria que o ouvinte de eventos verifica constantemente se o evento foi disparado, o que significa que, no meu cenário, não seria diferente de verificar todos os quadros se o evento foi disparado.
Com base na discussão em sala de aula, parece que o ouvinte de eventos funciona de uma maneira diferente.
Como um ouvinte de eventos funciona?
Como você suspeitou, um evento pode funcionar através de pesquisas. E se um evento está de alguma forma relacionado a acontecimentos externos, por exemplo, uma tecla do teclado sendo pressionada, a pesquisa precisa acontecer em algum momento.
Também é verdade que os eventos não precisam necessariamente envolver pesquisas. Por exemplo, se o evento é quando um botão é pressionado, o ouvinte de evento desse botão é um método que a estrutura da GUI pode chamar quando determina que um clique do mouse bate no botão. Nesse caso, ainda era necessário realizar a pesquisa para que o clique do mouse fosse detectado, mas o ouvinte do mouse é um elemento mais passivo conectado ao mecanismo de pesquisa primitiva por meio do encadeamento de eventos.
Atualização: na pesquisa de hardware de baixo nível
Acontece que os dispositivos USB e outros protocolos de comunicação modernos têm um conjunto de protocolos bastante fascinante para interações, permitindo que dispositivos de E / S, incluindo teclados e mouses, se envolvam em topologias ad hoc .
Curiosamente, as " interrupções " são coisas bastante imperativas e síncronas, para que não lidem com topologias de rede ad hoc . Para corrigir isso, " interrupções " foram generalizadas em pacotes assíncronos de alta prioridade chamados " transações de interrupção " (no contexto do USB) ou " interrupções sinalizadas por mensagem " (no contexto do PCI). Este protocolo é descrito em uma especificação USB:
- " Figura 8-31. Máquina de estado de host de transação OUT de volume / controle / interrupção " em "Especificação de barramento serial universal, revisão 2.0" , página impressa-222; Página-PDF-250 (27-04-200 2000)
A essência parece ser que dispositivos de E / S e componentes de comunicação (como hubs USB) agem basicamente como dispositivos de rede. Então, eles enviam mensagens, o que requer a pesquisa de suas portas e tal. Isso alivia a necessidade de linhas de hardware dedicadas.
Sistemas operacionais como Windows parecem lidar com o próprio processo de votação, por exemplo, como descrito na documentação do MSDN para o USB_ENDPOINT_DESCRIPTOR
's que descreve como controlar a frequência do Windows urnas um controlador de host USB para mensagens de interrupção / isócronos:
O bInterval
valor contém o intervalo de pesquisa para pontos finais de interrupção e isócrono. Para outros tipos de terminal, esse valor deve ser ignorado. Este valor reflete a configuração do dispositivo no firmware. Os drivers não podem mudar isso.
O intervalo de pesquisa, juntamente com a velocidade do dispositivo e o tipo de controlador host, determinam a frequência com a qual o driver deve iniciar uma interrupção ou uma transferência isócrona. O valor em bInterval
não representa um período fixo de tempo. É um valor relativo, e a frequência real de pesquisa também dependerá se o dispositivo e o controlador host USB operam em velocidade baixa, máxima ou alta.
- "Estrutura USB_ENDPOINT_DESCRIPTOR" , Centro de Desenvolvimento de Hardware, Microsoft
Protocolos de conexão de monitor mais recentes, como o DisplayPort, parecem fazer o mesmo:
Transporte Multi-Stream (MST)
-Slide # 14 de "DisplayPortTM Ver.1.2 Overview" (2010-12-06)
Essa abstração permite alguns recursos interessantes, como a execução de 3 monitores em uma conexão:
O DisplayPort Multi-Stream Transport também permite conectar três ou mais dispositivos juntos, mas, ao contrário, configuração menos orientada ao "consumidor": direciona simultaneamente vários monitores a partir de uma única porta de saída.
- "DisplayPort" , Wikipedia
Conceitualmente, o ponto a se afastar disso é que os mecanismos de pesquisa permitem comunicações seriais mais generalizadas, o que é incrível quando você deseja uma funcionalidade mais geral. Portanto, o hardware e o SO fazem muitas pesquisas para o sistema lógico. Em seguida, os consumidores que se inscrevem em eventos podem aproveitar esses detalhes sendo tratados pelo sistema de nível inferior, sem precisar escrever seus próprios protocolos de pesquisa / transmissão de mensagens.
Por fim, eventos como pressionamentos de teclas parecem passar por uma série bastante interessante de eventos antes de chegar ao mecanismo imperativo de acionamento de eventos do nível de software.