イベント (プログラミング)

プログラミングにおけるイベント () は、プログラム内で発生した動作・出来事、またそれらを表現する信号である。メッセージあるいはアクション（動作）とも呼ばれる。

イベントの例としてWEBブラウザにおける「クリック」動作、ネットワークリクエストにおける「fetch完了」出来事が挙げられる。動作・出来事そのものではなく、それらをプログラム上で表現し詳細情報を保持しているオブジェクト（イベントオブジェクト）を単純にイベントと呼ぶことが多い。

イベントドリブン 
イベントドリブン (イベント駆動型、) とは、イベントに応じて選択的にインスタンスへの処理（メソッドの実行）やコンテクストの切り替えを行う方式である。アクションの例としては、キーボードのキーが押される、マウスのボタンがクリックされる、などがある。アクションが発生すると、イベント信号が付帯情報（キー種別やボタン種別などのデータ）とともに発信される。また、アクションを起爆剤としてさらに他のプログラムコードが動かされたりするようにプログラミングすることをイベント駆動型プログラミングと称することが多い。

一般的にGUIアプリケーションソフトウェアのプログラミングでは、イベントの発生を監視しながら待機するイベントループ（メッセージループ）にて、オペレーティングシステムから受け取ったイベント（メッセージ）オブジェクトを、あらかじめ登録されたコールバック関数にディスパッチ（配送）してイベントに応じたユーザー処理（イベントハンドラー）を実行し、再びイベントループに戻るポーリング的な手法が用いられている。

なお、登録されるコールバック関数はそれぞれインタフェースが決まっており、プログラマはインタフェースを除いてこの関数の中身を自由に記述することでイベントを処理することができる。

通常、コールバック処理の登録は関数ポインタやデリゲートなどを用いて実現される。Javaではコールバック処理のカスタマイズに、イベントリスナーインタフェースを実装するカスタム派生クラスでのメソッドオーバーライドを利用する。イベントを言語の仕様として組み込んでいるプログラミング言語、たとえばC#では、特定のアクションが発生した場合に呼び出されるイベントハンドラーを簡潔に記述・登録できる。

DOM Events 
DOMイベントはWebにおいて発生した動作・出来事である。 正格な定義としては、Document Object Model（DOM）で定義されたEventinterfaceを実装するオブジェクトが event と呼ばれる。

例として、ウェブブラウザが発火するclick イベントや keydownイベントが挙げられる。またプログラマが任意に発火できるカスタムイベント（CustomEvent interfaceの実装）も存在する。これらのイベントを用いることでマウスクリックのような動作（アクション）、ネットワークリクエスト完了のような出来事（イベント）の発生を表現し、イベントに応答した振る舞いを定義できる。

DOM Eventsの特徴は、イベントの伝播がDOM（ウェブブラウザ処理系）によって扱われる点にある。イベントはDOM treeのnodeに対して発行され、treeのrootへ向かって各nodeで処理されながら伝播していく。この伝播はすべてウェブブラウザによって処理されており、その点でウェブブラウザはイベント（メッセージ）処理のためのミドルウェアとして働いているとみなすことができる。

排他制御におけるイベント 
Windows（Win32以降）には、「イベント」と呼ばれるカーネルオブジェクトがあり、「Win32イベント」と呼ばれることもある。このオブジェクトは、前述のイベントドリブンとはなんら関係ない。イベントオブジェクトは、そのオブジェクトがシグナル（発信）されることにより、待機状態にあるスレッドを再開させるなど、待機状態にある何らかの処理を起動する目的に使われる。また、プロセス間をまたいでイベントオブジェクトを共有できることから、スレッド間通信のみならずプロセス間通信にも利用される。

Win32イベントはイベント的事象を伝達することに特化しており、待機中スレッドがイベント待ちから解放されたとき、自動的にイベントを非シグナル状態にするといった機能がある。セマフォと似ているが、決定的な違いは、イベントは資源数が常に1であり、また伝達できる情報はシグナル発生のみである点である。

イベントは、各APIごとに次のようなクラスまたは関数を通して提供されている。
 Windows API - CreateEvent()関数（HANDLE型オブジェクト）
 ATL/MFC - CEventクラス
 .NET Framework - System.Threading.AutoResetEventクラス、System.Threading.ManualResetEventクラス

脚注

関連項目 

イベント駆動型プログラミング
イベントループ
擬似プリエンプティブ
割り込み
例外処理

排他制御
OSのプロセス管理