イベント (プログラミング)
![]() |
イベント (英: event) とは、コンピュータ・プログラムの実行に際し、(プロセス間で共有するイベントカウンタのインスタンスが条件を満たしたときなど)何らかのアクションが発生した際にプログラムに発信される信号(これをメッセージと呼んだりする)を指す。
イベントドリブン[編集]
イベントドリブン (イベント駆動型、英: event-driven) とは、イベントに応じて選択的にインスタンスへの処理(メソッドの実行)やコンテクストの切り替えを行う方式である。アクションの例としては、キーボードが押される、マウスがクリックされる、などがある。アクションが発生すると、イベント信号が付帯情報(キー種別やボタン種別などのデータ)とともに発信される。また、アクションを起爆剤としてさらに他のプログラムコードが動かされたりするようにプログラミングすることをイベント駆動型プログラミングと称することが多い。
一般的にGUIアプリケーションソフトウェアのプログラミングでは、イベントループ(メッセージループ)にてオペレーティングシステムから受け取ったイベント(メッセージ)オブジェクトを、コールバック関数として登録されたウィンドウプロシージャ(window procedure)にディスパッチ(配送)してイベントに応じたユーザー処理(イベントハンドラー)を実行し、再びイベントループに戻るポーリング的な手法が用いられている。
なお、ウィンドウプロシージャなどのコールバック関数はそれぞれインタフェースが決まっており、プログラマはインタフェースを除いてこの関数の中身を自由に記述することでイベントを処理することができる。
通常、コールバック処理の登録は関数ポインタやデリゲートなどを用いて実現される。Javaではコールバック処理のカスタマイズに、イベントリスナーを実装するカスタム派生クラスでのメソッドオーバーライドを利用する。イベントを言語の仕様として組み込んでいるプログラミング言語、たとえばC#では、特定のアクションが発生した場合に呼び出されるイベントハンドラーを簡潔に記述・登録できる。
排他制御におけるイベント[編集]
Windows(Win32以降)には、「イベント」と呼ばれるカーネルオブジェクトがあり、「Win32イベント」と呼ばれることもある。このオブジェクトは、前述のイベントドリブンとはなんら関係ない。イベントオブジェクトは、そのオブジェクトがシグナル(発信)されることにより、待機状態にあるスレッドを再開させるなど、待機状態にある何らかの処理を起動する目的に使われる。また、プロセス間をまたいでイベントオブジェクトを共有できることから、スレッド間通信のみならずプロセス間通信にも利用される。
Win32イベントはイベント的事象を伝達することに特化しており、待機中スレッドがイベント待ちから解放されたとき、自動的にイベントを非シグナル状態にするといった機能がある。セマフォと似ているが、決定的な違いは、イベントは資源数が常に1であり、また伝達できる情報はシグナル発生のみである点である。
イベントは、各APIごとに次のようなクラスまたは関数を通して提供されている。
- Windows API -
CreateEvent()
関数(HANDLE
型オブジェクト) - ATL/MFC -
CEvent
クラス - .NET Framework -
System.Threading.AutoResetEvent
クラス、System.Threading.ManualResetEvent
クラス