用語
イベント:発生する可能性のある種類。
イベント発生:イベントの特定の発生。イベントが発生します。
イベントリスナー:イベントの発生を監視するもの。
イベントハンドラー:イベントリスナーがイベントの発生を検出したときに発生するもの。
イベントサブスクライバー:イベントハンドラーが呼び出すことになっている応答。
これらの定義は実装に依存しないため、さまざまな方法で実装できます。
これらの用語の一部は、ユーザーがそれらを区別する必要がないことが多いため、一般に同義語と間違えられます。
一般的なシナリオ
プログラミングロジックイベント。
イベントには、いくつかのメソッドが呼び出されたときです。
イベントの焼成は、そのメソッドへの特定のコールです。
イベントリスナーは、イベントハンドラを呼び出す各イベントの発火に呼ばれていますイベントメソッドでフックです。
イベントハンドラは、イベントの加入者のコレクションを呼び出します。
イベントの加入者(複数)は、システムがイベントの発生に応答して発生するあらゆる手段アクション(複数可)を実行します。
外部イベント。
このイベントは、オブザーバブルから推測できる外部の出来事です。
イベントの発火は、その外部の出来事が発生したと認識することができたときです。
イベントリスナーは、何らかの形で、多くの場合、ポーリングによって、イベントの発射を検出し、観察(s)は、それが発火イベントを検出すると、イベントハンドラが呼び出されます。
イベントハンドラは、イベントの加入者のコレクションを呼び出します。
イベントの加入者(複数)は、システムがイベントの発生に応答して発生するあらゆる手段アクション(複数可)を実行します。
ポーリングとイベントの発生メカニズムへのフックの挿入
他の人が言ったポイントは、ポーリングはしばしば必要ないということです。これは、イベントがシステムレベルで発生する場合にイベントを実行する最も効率的な方法であるイベントハンドラーを自動的に呼び出すことにより、イベントリスナーを実装できるためです。
同様に、郵便局員がドアをノックしてメールを直接あなたに渡す場合、毎日メールのメールボックスをチェックする必要はありません。
ただし、イベントリスナーはポーリングによっても機能します。ポーリングでは、必ずしも特定の値またはその他の観測可能な値をチェックする必要はありません。より複雑になる可能性があります。しかし、全体として、ポーリングのポイントは、何らかのイベントが発生して応答できるようになるタイミングを推測することです。
たとえると、郵便局員が郵便物を入れただけで毎日メールボックスをチェックする必要があります。郵便局員にドアをノックするように指示できれば、このポーリング作業を行う必要はありませんが、それは多くの場合不可能です。
イベントロジックの連鎖
多くのプログラミング言語では、キーボードのキーが押されたとき、または特定の時間に呼び出されるイベントを作成できます。これらは外部イベントですが、ポーリングする必要はありません。どうして?
オペレーティングシステムがあなたのためにポーリングしているからです。たとえば、Windowsはキーボードの状態変化などをチェックし、それを検出すると、イベントサブスクライバーを呼び出します。したがって、キーボードプレスイベントをサブスクライブすると、実際には、ポーリングするイベントのサブスクライバーであるイベントをサブスクライブします。
たとえば、あなたがアパートに住んでいて、郵便局員が郵便物を共同の郵便物受け取りエリアに落とすとします。次に、オペレーティングシステムに似た作業者が全員のメールを確認し、何かを受け取った人のアパートにメールを配信します。これにより、他のすべての人がメール受信エリアをポーリングする必要がなくなります。
私の直感では、イベントリスナーはイベントが発生したかどうかを常にチェックすると想定します。つまり、私のシナリオでは、イベントが発生した場合はすべてのフレームをチェックすることと同じです。
クラスでの議論に基づいて、イベントリスナーは異なる方法で動作するようです。
イベントリスナーはどのように機能しますか?
ご想像のとおり、イベントはポーリングを通じて機能します。また、イベントが何らかの形で外部の出来事に関連している場合(キーボードのキーが押されるなど)、ある時点でポーリングを行う必要があります。
また、イベントが必ずしもポーリングを必要としないことも事実です。たとえば、ボタンが押されたときにイベントが発生する場合、そのボタンのイベントリスナーは、マウスクリックがボタンを押したと判断したときにGUIフレームワークが呼び出すメソッドです。この場合、マウスクリックを検出するためにポーリングを行う必要がありましたが、マウスリスナは、イベントチェーンを通じてプリミティブポーリングメカニズムに接続される、より受動的な要素です。
更新:低レベルのハードウェアポーリングについて
USBデバイスやその他の最新の通信プロトコルには、相互作用のためのかなり魅力的なネットワークのようなプロトコルのセットがあり、キーボードやマウスを含むI / Oデバイスがアドホックトポロジに関与できることがわかります。
興味深いことに、「割り込み」はかなり必須の同期的なものであるため、アドホックネットワーキングトポロジを処理しません。これを修正するために、「割り込み」は「割り込みトランザクション」(USBのコンテキスト)または「メッセージ信号割り込み」(PCIのコンテキスト)と呼ばれる非同期の高優先度パケットに一般化されました。このプロトコルは、USB仕様で説明されています。
- 「図8-31バルク/コントロール/インタラプトOUTトランザクションホストステートマシンで」『ユニバーサルシリアルバス仕様、リビジョン2.0』、印刷されたページ-222; PDFページ250(2000-04-27)
要点は、I / Oデバイスと通信コンポーネント(USBハブなど)が基本的にネットワークデバイスのように振る舞うということです。そのため、ポートをポーリングする必要があるメッセージなどを送信します。これにより、専用のハードウェアラインの必要性が軽減されます。
Windowsのようなオペレーティングシステムはで説明したように、たとえば、ポーリングプロセス自体、取り扱うように見えるため、MSDNのドキュメントUSB_ENDPOINT_DESCRIPTOR
の割り込み/アイソクロナスのメッセージの頻度を、WindowsのポーリングUSBホストコントローラを制御する方法について説明します:
bInterval
値は、割り込みとアイソクロナスエンドポイントのポーリング間隔が含まれています。他のタイプのエンドポイントの場合、この値は無視する必要があります。この値は、ファームウェアでのデバイスの構成を反映しています。ドライバーは変更できません。
ポーリング間隔は、デバイスの速度とホストコントローラーの種類と共に、ドライバーが割り込みまたはアイソクロナス転送を開始する頻度を決定します。の値はbInterval
、一定の時間を表すものではありません。これは相対的な値であり、実際のポーリング頻度は、デバイスとUSBホストコントローラーが低速、フル、または高速で動作するかどうかにも依存します。
- 「USB_ENDPOINT_DESCRIPTOR構造」、Microsoft、ハードウェアデベロッパーセンター
DisplayPortのような新しいモニター接続プロトコルも同じように見えます:
マルチストリームトランスポート(MST)
-Slide #から14 "DisplayPortTM Ver.1.2の概要"(2010-12-06)
この抽象化により、1つの接続から3つのモニターを実行するなど、いくつかの便利な機能が可能になります。
DisplayPort Multi-Stream Transportを使用すると、3つ以上のデバイスを接続できますが、逆に「消費者」指向の構成ではなく、単一の出力ポートから複数のディスプレイを同時に駆動できます。
- "DisplayPort"、ウィキペディア
概念的には、これを取り除くポイントは、ポーリングメカニズムにより、より一般化されたシリアル通信が可能になることです。これは、より一般的な機能が必要な場合に最適です。そのため、ハードウェアとOSは論理システムに対して多くのポーリングを行います。その後、イベントをサブスクライブするコンシューマーは、独自のポーリング/メッセージ受け渡しプロトコルを作成することなく、下位レベルのシステムによって処理されるイベントの詳細を楽しむことができます。
最終的に、キーを押すなどのイベントは、ソフトウェアレベルの命令型イベント発行メカニズムに到達する前に、かなり興味深い一連のイベントを通過するようです。