- PR -

メッセージループ

1
投稿者投稿内容
eno
常連さん
会議室デビュー日: 2008/08/22
投稿数: 28
お住まい・勤務地: 代々木上原
投稿日時: 2008-09-01 13:07
なんどもくらだらない系の質問ですみません。

仮に不必要なイベントハンドラーを以下のように生成し、そのまま実行した場合、
単なるメモリリソースの消費だけではなく、メッセージループがイベントハンドラー内で発生してCPUを余計にくったりして動作が低速になったりするんでしょうか?

this.pictureBox0.Click += new System.EventHandler(this.pictureBox0_Click);

private void pictureBox0_Click(object sender, EventArgs e)
{

}

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-09-03 21:46
 イベントの処理と発生<microsoft.com>あたりを読んでみてください。

 おそらく、Windows アプリケーションの作成について、知識をお持ちなのだと思います。Windows で発生する、あるいは MFC などで定義する様な「イベント」と、.NET Framework が定義する「イベント」は違います。
 .NET Framework が定義するイベントは、デリゲートによって実現されていますが、これは関数ポインタによる関数呼び出しです。
 ご呈示のコードでは、PictureBox クラスのプロパティ Click に、pictureBox0_Click メソッドのアドレスが格納されます。イベント発生ルーチンは、次のようになっています。
コード:
OnClick(object sender)
{
    if (this.Click) {
        this.Click(sender, new EventArgs());
    }
}



 メッセージは、PictureBox クラスが勝手に登録してしまっています。そのメッセージを、本当に扱うかどうかは、イベント ハンドラが登録されているかどうかで決まります。
 .NET Framework の範囲に限っては、イベント ハンドラと登録していないときと比較して、メモリ リソースが追加消費されることもなく、メッセージループが追加で発生することもありません。
eno
常連さん
会議室デビュー日: 2008/08/22
投稿数: 28
お住まい・勤務地: 代々木上原
投稿日時: 2008-09-04 10:35
object senderはこの場合、PictureBoxコントロールですよね。
このコントロールがクリックされたときにはじめてイベントデータに関するEventArgsコンストラクタが実行され、イベント元(PictureBox)とイベント処理(System.EventHandler(delegate_hogehoge))イベント受信先(this.pictureBox0.Clickプロパティ)にわけられるといった感じでしょうか?

イベント送信元からメッセージを受信する際に、イベントハンドラが生成されてイベントのロジックが実行されていくという.netではメッセージループは発生しえないということですか?
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2008-09-04 11:50
こんにちは。

引用:

enoさんの書き込み (2008-09-04 10:35) より:
イベント送信元からメッセージを受信する際に、イベントハンドラが生成されてイベントのロジックが実行されていくという.netではメッセージループは発生しえないということですか?



↑の強調部分がさっぱりわからないんですが…

enoさんにとって
・「イベントハンドラ」は実行時に生成できるものなんですか?
・「メッセージループ」は発生したり・しなかったりするものなのですか? (もしかして「モーダルメッセージループ」のこと!? )

(メッセージループ/)メインループ/イベントループ (Wikipedia)

イベント駆動型プログラミング (Wikipedia)
引用:

イベントハンドラ
イベントが発生した際に実行すべきサブルーチンのこと。


Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-09-04 23:24
引用:

enoさんの書き込み (2008-09-04 10:35) より:
このコントロールがクリックされたときにはじめてイベントデータに関するEventArgsコンストラクタが実行され、イベント元(PictureBox)とイベント処理(System.EventHandler(delegate_hogehoge))イベント受信先(this.pictureBox0.Clickプロパティ)にわけられるといった感じでしょうか?

イベント送信元からメッセージを受信する際に、イベントハンドラが生成されてイベントのロジックが実行されていくという.netではメッセージループは発生しえないということですか?


 私は、ずっと画面に関わらない処理ばかり作っていたので、あまり詳しくはないのですが。。。逆に、.NET Framework でイベントを先にさわっているので、MFC のイベント実装があまりにも面倒に思えます。
 最近メンテナンスすることになったコードを見ると、.c なプログラムで Windows のコントロールに発生する“イベント”を処理するには、こんな風に書くみたいですね。
コード:
BOOL FAR PASCAL
SomeDialogProc(hDlg, uMsg, wParam, lParam)
HWND hDlg;
UINT uMsg;
WPARAM wParam;
LPARAM lParam;
{
    switch (uMsg) {
    case WM_INITDIALOG: /* ダイアログ初期化 */
        return TRUE;
    case WM_LBUTTONDBLCLK: /* 左ボタンをダブルクリック */
        return TRUE;
    case WM_COMMAND:
        switch (LOWORD(wParam)) {
        case IDOK: /* OK ボタン */
            return TRUE;
        case IDCANCEL: /* キャンセル ボタン */
            return TRUE;
        }
        return FALSE;
    }
    return FALSE;
}


 MFC では、BEGIN_MESSAGE_MAP から END_MESSAGE_MAP の間で、イベント ハンドラを登録することになるのかな?
 「イベント送信元からメッセージを受信する」とは、これをイメージしているということでしょうか。
 Control クラスあたりで、この辺の実装はラップされています。おおよそのメッセージについては必要だろうが必要なかろうが、すでに受けています。ここでは「return TRUE;」と書いたところが、前回の投稿のコードになっている、と考えてくださればいいと思います。

# もちろん、処理がいるのだけれど、そういうのは省いていますから、念のため。
1

スキルアップ/キャリアアップ(JOB@IT)