- - PR -
メッセージループ
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-09-01 13:07
なんどもくらだらない系の質問ですみません。
仮に不必要なイベントハンドラーを以下のように生成し、そのまま実行した場合、 単なるメモリリソースの消費だけではなく、メッセージループがイベントハンドラー内で発生してCPUを余計にくったりして動作が低速になったりするんでしょうか? this.pictureBox0.Click += new System.EventHandler(this.pictureBox0_Click); private void pictureBox0_Click(object sender, EventArgs e) { } | ||||||||
|
投稿日時: 2008-09-03 21:46
イベントの処理と発生<microsoft.com>あたりを読んでみてください。
おそらく、Windows アプリケーションの作成について、知識をお持ちなのだと思います。Windows で発生する、あるいは MFC などで定義する様な「イベント」と、.NET Framework が定義する「イベント」は違います。 .NET Framework が定義するイベントは、デリゲートによって実現されていますが、これは関数ポインタによる関数呼び出しです。 ご呈示のコードでは、PictureBox クラスのプロパティ Click に、pictureBox0_Click メソッドのアドレスが格納されます。イベント発生ルーチンは、次のようになっています。
メッセージは、PictureBox クラスが勝手に登録してしまっています。そのメッセージを、本当に扱うかどうかは、イベント ハンドラが登録されているかどうかで決まります。 .NET Framework の範囲に限っては、イベント ハンドラと登録していないときと比較して、メモリ リソースが追加消費されることもなく、メッセージループが追加で発生することもありません。 | ||||||||
|
投稿日時: 2008-09-04 10:35
object senderはこの場合、PictureBoxコントロールですよね。
このコントロールがクリックされたときにはじめてイベントデータに関するEventArgsコンストラクタが実行され、イベント元(PictureBox)とイベント処理(System.EventHandler(delegate_hogehoge))イベント受信先(this.pictureBox0.Clickプロパティ)にわけられるといった感じでしょうか? イベント送信元からメッセージを受信する際に、イベントハンドラが生成されてイベントのロジックが実行されていくという.netではメッセージループは発生しえないということですか? | ||||||||
|
投稿日時: 2008-09-04 11:50
こんにちは。
↑の強調部分がさっぱりわからないんですが… enoさんにとって ・「イベントハンドラ」は実行時に生成できるものなんですか? ・「メッセージループ」は発生したり・しなかったりするものなのですか? (もしかして「モーダルメッセージループ」のこと!? ) (メッセージループ/)メインループ/イベントループ (Wikipedia) イベント駆動型プログラミング (Wikipedia)
| ||||||||
|
投稿日時: 2008-09-04 23:24
私は、ずっと画面に関わらない処理ばかり作っていたので、あまり詳しくはないのですが。。。逆に、.NET Framework でイベントを先にさわっているので、MFC のイベント実装があまりにも面倒に思えます。 最近メンテナンスすることになったコードを見ると、.c なプログラムで Windows のコントロールに発生する“イベント”を処理するには、こんな風に書くみたいですね。
MFC では、BEGIN_MESSAGE_MAP から END_MESSAGE_MAP の間で、イベント ハンドラを登録することになるのかな? 「イベント送信元からメッセージを受信する」とは、これをイメージしているということでしょうか。 Control クラスあたりで、この辺の実装はラップされています。おおよそのメッセージについては必要だろうが必要なかろうが、すでに受けています。ここでは「return TRUE;」と書いたところが、前回の投稿のコードになっている、と考えてくださればいいと思います。 # もちろん、処理がいるのだけれど、そういうのは省いていますから、念のため。 |
1