C#を勉強中の者です。
むかし MFC VC++ を少しだけかじったことがありまして、
その中で、ウィンドウメッセージというものをよく利用していました。
C#ではイベントというものをよく利用するようですが、
これは MFC C++ でいうところのウィンドウメッセージと同じようなものでしょうか。
つまり、イベントというのは、メッセージキューにためられたメッセージが処理される際に呼ばれるものなのでしょうか。
仮にそうだとすると、イベントを発行するというのは、ウィンドウメッセージを送るのと同じようなものでしょうか。
ウィンドウハンドルとかないし、違うような気がしますね...。
でも、割り込みというのとは違いますよね...?
入門書は読んだんですが(いくつも読んだわけではないのですが...)、
使い方は書いてあってなんとなく理解はできた一方、
仕組み的なところがしっくりきません。
分かりやすい説明をいただけるとうれしいです。
よろしくお願いします。
No.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のように,トリガとイベントが別のスレッド,ということはできる。
また,イベントハンドラがイベントのトリガを引けば当然イベントが発生します。
それを抑止することもあるでしょうけれども,それはトリガ側の実装次第になります。
回答をありがとうございます。
そうですよね、ウィンドウメッセージとは関係ありませんね。
いまの知識では、教えていただだいたことを、まだ完全には理解できませんが、
なんとなくわかりました。
まだよく分かっていないせいもあって、
ウィンドウメッセージに比べて、
イベントに対して漠然とした不安があります。
その不安がうまく表現できない...。
ウィンドウメッセージだとキューにたまって FIFO が保障されるけど(Sendを除き)、
イベントはそのあたりがよく分からないのですが、
なにが問題に思えるのか自分でもよくまとまっていません。
とりあえずもう少しプログラミングをしつつ勉強してみます。
ありがとうございました。
No.2
- 回答日時:
>>これは MFC C++ でいうところのウィンドウメッセージと同じようなものでしょうか。
C#でプログラムを作っていたときは、同じようなものと思ってやっていましたよ。
ちょっと標準ではない処理を実行する場合、メッセージを送ることもやりました。
>>ウィンドウハンドルとかないし、違うような気がしますね...。
C#でもウインドウハンドルの取得をやったりします。
>>仕組み的なところがしっくりきません。
入門書には、そういう部分は記述されていないと思います。そこまで記述したら初心者はついてこれないかも?
私の場合は、入門書やリファレンス本、C#文法書を見たあと、
・究極のC#プログラミング/新スタイルによる実戦的コーディング
・C#によるコンポーネントプログラミング
・プログラミングADO.NET 2.0
・プログラミング.NET Framework
・メタプログラミング.NET
などを読みました。仕組み的な面は、「メタプログラミング.NET」を読まれるのがいいと思います。
回答をありがとうございました。
たくさんの本を読まれているんですね。
やはりプロはそのくらい知識を持ってないとできないものなのでしょうね。
精進したいと思います。
と、言ってもそんなに開発の機会はないのですが。
ウィンドウメッセージだと、
PostするとキューにたまってFIFOで処理されますが、
イベントを発行した場合はどうなんだろうと疑問に思った次第です。
ウィンドウメッセージの場合は、
ひとつのメッセージの処理を終えてシステムに制御が戻るまで、
次のメッセージは処理されないけれども、
イベントの場合だと、
例えば複数のスレッドからイベントが発生した場合、
あるイベントの処理中に別のイベントの処理が起こるとか...。
そんなことはないですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 プレビューウインドウに表示されたメッセージについて 1 2022/04/13 13:53
- その他(プログラミング・Web制作) pythonで、tkinterとpillowの組み合わせ 2 2022/08/16 17:42
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- Windows 10 (続き)2つのウィンドウ選択時の表示について 6 2023/08/13 15:05
- Windows 10 2つのウィンドウ選択時の表示について 10 2023/07/25 08:48
- C言語・C++・C# C++アンインストールの影響 5 2022/10/15 08:49
- その他(OS) Windowsで大量の画像サイズを半自動で変更する方法 6 2023/02/17 08:45
- 統計学 t検定を繰り返してはいけない理由について教えて下さい。 2 2022/05/15 12:37
- Access(アクセス) Access の SetFocus について教えてください 5 2022/08/04 07:32
- 教えて!goo 質問サイトで読解力がない奴と話すとイライラします。こういう人の対処法を教えてください。 22 2022/09/12 08:44
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
勝手にウィンドウが開いて止ま...
-
親ウインドウにあるOKボタンを...
-
「&HFFFF」「&H1A」とは?
-
EnumChildWindowsの使い方(VBA)
-
ゲームでは結局どっちが良いの?
-
Vba LongPtrについて教えてくだ...
-
UWSCで特定のChromeのタブをア...
-
隠れたウィンドウの画面をキャ...
-
Excelの上下を固定したい
-
最大化と最小化ボタン
-
ウインドウを最小化させる
-
ラジオボタンの初期指定
-
デスクトップにフォーカスを移動
-
Excel で2つウインドウ枠の...
-
focusメソッドを使ってもカーソ...
-
MFC ダイアログ上のID取得につ...
-
エクセルで1行目から3行目が消...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
勝手にウィンドウが開いて止ま...
-
ゲームでは結局どっちが良いの?
-
Excelの上下を固定したい
-
VBA .Value=.Value ?
-
Vba LongPtrについて教えてくだ...
-
他のアプリケーションの終了処理
-
[VBA] UserForm を Excel の W...
-
Alt+P,Alt+NをPostmessageで送...
-
「&HFFFF」「&H1A」とは?
-
隠れたウィンドウの画面をキャ...
-
作成したウインドウのサイズを...
-
UWSCで特定のChromeのタブをア...
-
名前を付けて保存のウィンドウ...
-
【VB2008】 マウス操作の一時的...
-
ExcelのBOOKが消えた!
-
ラジオボタンの初期指定
-
MFC ダイアログ上のID取得につ...
おすすめ情報