No.8 Appendix C Windowsプログラミング(3)

| | トラックバック(0)
3 Windowsアプリケーションのプログラミングの概要

フォーム・アプリケーションの構造
 Windowsで一般的な、フォームをもつアプリケーションでは、ボタンやテキスト・ボックスなどのビジュアルなコントロールがフォーム上に配置され、それをユーザがマウスやキーボード入力で操作できるようになっています。
 ソフトウェアでは、このような操作で発生したイベントにより、それに応じたメソッド(イベント・ハンドラ)が呼び出されるような仕組みになっています。そのメソッドに所望の処理を組み込めば、イベントに応じた処理を実行させることができます。
 その他、シリアル・データの受信やタイマ処理など、ユーザ操作が直接関係しないイベントもあります。このようなイベントに対してもプログラミングの考え方は同じです。

イベント・ハンドラについて
 イベント・ハンドラとは、ボタンがクリックされたときや、シリアル・データを受信したときなどにWindowsから呼び出されるメソッドのことで、Windowsでは単にイベントと呼ばれることもあります。「イベント・オブジェクト」というものもありますが、これは別ものなので区別してください。
 実際のイベント・ハンドラは、“Windowsメッセージ”がWindowsからアプリケーションへ送られてくることにより起動しますが、この部分の処理の実体は、メッセージを振り分ける巨大なswitch-case文です。実際、Visual C++やVisual Studioがまだ発売されていなかった、Windows3.Xの頃まで一般的だった、C言語でWindows APIを駆使して作成するプログラミングでは、アプリケーションごとのメイン・ルーチンにはswitch-case文でメッセージを振り分けるようなコードを書いていました。現在では特殊な場合を除き、このswitch-case文を直接目にすることはなくなりました(コールバック関数を使用したり、メッセージ・クラッカなどの隠蔽手段が用意されている)。

スレッド・セーフな処理とデリゲート
 Visula C#やBasicなどでは、あるスレッドから別のスレッドのコントロール(たとえば別のフォームにあるテキスト・ボックスなど)を直接操作することができません。今回はSerialPortコントロールを使用しますが、このコントロールはForm1のスレッドとは別のスレッドで動作しているため、シリアル・データ受信のイベント・ハンドラで、直接Form1上のテキスト・ボックスを書き換えるようなことはできません。
 そこで、デリゲートというオブジェットを作成してWindowsからコールバックしてもらうことで、間接的にテキスト・ボックスの内容を書き換えています。このように、スレッド間で安全に実行される処理をスレッド・セーフな処理と言います。
 デリゲートとは、C/C++言語などの関数ポインタ(関数のアドレスを保持するポインタ)のようなものですが、デリゲートには関数ポインタ以外に引数も一緒に保持することができます(カプセル化)。
 このデリゲートをWindowsに登録[インスタンス(実体)化]しておいて、スレッド・セーフに処理できるタイミングでWindowsから呼び出してもらいます。
中尾 司

カテゴリ

,

トラックバック(0)

このブログ記事を参照しているブログ一覧: No.8 Appendix C Windowsプログラミング(3)

このブログ記事に対するトラックバックURL: http://www.eleki-jack.com/mt/mt-tb.cgi/1936


エレキジャック
エレキジャックのトップに戻る


雑誌 No.