2 イベント駆動型プログラム

2.1 従来のプログラムとの違い

これまで学習してきたプログラムは,プログラムに記述されたとおりに実行された.通常 はプログラムは上から下へ実行されれるが,ifや繰り返し文があるとそれに従う.プ ログラムは,フロー(flow:流れ)を記述することになるので,フロー駆動型プログラムと 呼ばれる.

それに対して,イベント(event:出来事)に対して,実行される内容が変化するプログラム をイベント駆動型プログラムと呼ぶ.例えば,マウスを動かすと,それに反応するゲーム プログラムなどである.このようなプログラムでは,フローの代わりにイベントに応じた 動作を記述する.プログラムに必要なことは,イベントの監視とどの動作内容である.こ のようなイベントの監視と動作内容をあわせて,イベントハンドラと呼ぶことがある.

ここで,学習しているGLUTを使ったプログラムは,イベント駆動型のプログラムである. 作成したウインドウをクリックして他のウインドウの上にしたり,または移動させたりす ると自動的に再描画してくれる.クリックとか移動とかのイベントに対応して,プログラ ムが実行されている.

2.2 簡単な仕組み

イベント駆動型プログラムは,さまざまなイベント2に対するプログラムの反応を記述する.このようなプログラムで は,次々に生じるイベントをどのようにして処理するのか?--というような疑問が生じる であろう.

イベントはイベントキュー(event queue)に入れられて,古いイベントから順に取り出さ れる.取り出されたイベントは,それに対応する処理を行う.プログラム中では,イベン トに対応する処理は,コールバック関数(callback function)を使って記述する.

プログラムは,イベントに対する処理内容コールバック関数で記述した後,イベントルー プと呼ばれる無限ループに動作が移る.この無限ループで,イベントを監視の監視と,そ れに対応する処理を永遠行うことになる.先週学習したリスト1の例 では,

である.
   1 #include <stdio.h>
   2 #include <GL/glut.h>
   3 
   4 void draw(void);                            // プロトタイプ宣言
   5 void set_color(void);
   6 
   7 //====================================================================
   8 // main関数
   9 //====================================================================
  10 int main(int argc, char *argv[])
  11 {
  12 
  13   glutInit(&argc, argv);                    // GLUT 初期化
  14   glutInitDisplayMode(GLUT_RGBA);           // 表示モードの指定
  15   glutCreateWindow("Yamamoto's window");    // windowをタイトルを付けてを開く
  16   glutDisplayFunc(draw);                    // イベントにより呼び出し
  17   set_color();                              // 塗りつぶす色指定
  18   glutMainLoop();                           // GLUTの無限ループ
  19 
  20   return 0;
  21 }
  22 
  23 //====================================================================
  24 // ウィンドウを塗りつぶす
  25 //====================================================================
  26 void draw(void)
  27 {
  28   glClear(GL_COLOR_BUFFER_BIT);
  29   glFlush();                           // 描画
  30 }
  31 
  32 //====================================================================
  33 // 色の指定
  34 //====================================================================
  35 void set_color(void)
  36 {
  37   glClearColor(1.0, 0.0, 0.0, 1.0);  //赤緑青と透明度
  38 }



ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成19年11月21日


no counter