プロが教える店舗&オフィスのセキュリティ対策術

C#を勉強中の者です。

むかし MFC VC++ を少しだけかじったことがありまして、
その中で、ウィンドウメッセージというものをよく利用していました。

C#ではイベントというものをよく利用するようですが、
これは MFC C++ でいうところのウィンドウメッセージと同じようなものでしょうか。

つまり、イベントというのは、メッセージキューにためられたメッセージが処理される際に呼ばれるものなのでしょうか。
仮にそうだとすると、イベントを発行するというのは、ウィンドウメッセージを送るのと同じようなものでしょうか。
ウィンドウハンドルとかないし、違うような気がしますね...。
でも、割り込みというのとは違いますよね...?

入門書は読んだんですが(いくつも読んだわけではないのですが...)、
使い方は書いてあってなんとなく理解はできた一方、
仕組み的なところがしっくりきません。

分かりやすい説明をいただけるとうれしいです。
よろしくお願いします。

A 回答 (3件)

> ウィンドウメッセージだと、


> PostするとキューにたまってFIFOで処理されますが、
> イベントを発行した場合はどうなんだろうと疑問に思った次第です。

ウィンドウメッセージとC#のeventは無関係です。
WinFormsの一部のイベントはウィンドウメッセージによって作り出されますが,
これはC#のeventの本質とは関係しません。


> イベントの場合だと、
> 例えば複数のスレッドからイベントが発生した場合、
> あるイベントの処理中に別のイベントの処理が起こるとか...。

イベントの発生とは本質的にデリゲートの実行です。
public event EventHandler Foo;

private EventHandler _Foo; // 実際には<>とかが付いてアクセスできない名前が使われる

public event EventHandler Foo
{
add
{
_Foo += value;
}
remove
{
_Foo -= value;
}
}
ですし,上記に対して,
Foo(this, EventArgs.Empty);
は実際には
_Foo(this, EventArgs.Empty);
となっています。

つまり,イベントの発生とはデリゲートの通常の呼び出しに過ぎません。
このため,イベントハンドラの実行はイベントが実際に呼び出されたスレッドで実行されます。
# BackgroundWorkerのように,トリガとイベントが別のスレッド,ということはできる。

また,イベントハンドラがイベントのトリガを引けば当然イベントが発生します。
それを抑止することもあるでしょうけれども,それはトリガ側の実装次第になります。
    • good
    • 0
この回答へのお礼

回答をありがとうございます。

そうですよね、ウィンドウメッセージとは関係ありませんね。
いまの知識では、教えていただだいたことを、まだ完全には理解できませんが、
なんとなくわかりました。

まだよく分かっていないせいもあって、
ウィンドウメッセージに比べて、
イベントに対して漠然とした不安があります。

その不安がうまく表現できない...。
ウィンドウメッセージだとキューにたまって FIFO が保障されるけど(Sendを除き)、
イベントはそのあたりがよく分からないのですが、
なにが問題に思えるのか自分でもよくまとまっていません。

とりあえずもう少しプログラミングをしつつ勉強してみます。

ありがとうございました。

お礼日時:2013/12/05 20:45

>>これは MFC C++ でいうところのウィンドウメッセージと同じようなものでしょうか。



C#でプログラムを作っていたときは、同じようなものと思ってやっていましたよ。
ちょっと標準ではない処理を実行する場合、メッセージを送ることもやりました。

>>ウィンドウハンドルとかないし、違うような気がしますね...。

C#でもウインドウハンドルの取得をやったりします。

>>仕組み的なところがしっくりきません。

入門書には、そういう部分は記述されていないと思います。そこまで記述したら初心者はついてこれないかも?
私の場合は、入門書やリファレンス本、C#文法書を見たあと、

・究極のC#プログラミング/新スタイルによる実戦的コーディング
・C#によるコンポーネントプログラミング
・プログラミングADO.NET 2.0
・プログラミング.NET Framework
・メタプログラミング.NET

などを読みました。仕組み的な面は、「メタプログラミング.NET」を読まれるのがいいと思います。
    • good
    • 0
この回答へのお礼

回答をありがとうございました。

たくさんの本を読まれているんですね。
やはりプロはそのくらい知識を持ってないとできないものなのでしょうね。
精進したいと思います。
と、言ってもそんなに開発の機会はないのですが。

ウィンドウメッセージだと、
PostするとキューにたまってFIFOで処理されますが、
イベントを発行した場合はどうなんだろうと疑問に思った次第です。

ウィンドウメッセージの場合は、
ひとつのメッセージの処理を終えてシステムに制御が戻るまで、
次のメッセージは処理されないけれども、
イベントの場合だと、
例えば複数のスレッドからイベントが発生した場合、
あるイベントの処理中に別のイベントの処理が起こるとか...。
そんなことはないですね。

お礼日時:2013/12/03 16:02

C#のイベントは言語仕様化されたObserverパターンです。

    • good
    • 0
この回答へのお礼

回答をありがとうございます。

言語仕様化されたObserverパターンですか...。
早速調べてみました。

モデル、というか、概念、というか、
そういうのは分かりました。

勉強が必要です。

ありがとうございました。

お礼日時:2013/12/03 13:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!