
windowsのメッセージは、元のスレッドと関係なしに勝手に実行されますよね?
たとえばSetTimerを呼びだした状態でウィンドウプロシージャ内で
case WM_TIMER:
MessageBox(NULL,"","",MB_OK);
break;
とすれば、メッセージボックスを閉じようが、閉じまいが一定時間ごとに、新たにメッセージボックスが生成されます。
しかし、Win32の本などを見ると、プロシージャからただのグローバル変数にアクセスするなど、通常のマルチスレッドではやってはいけないとされる事を平気でやっています。
この点で、マルチスレッドとメッセージ機構はどのように違うのか、ご存知の方、教授お願いします。
ナンセンスな疑問でしたらすいません。
No.2ベストアンサー
- 回答日時:
ウィンドウメッセージは全て、そのウィンドウを作成したスレッドで実行されます。
このメッセージ機構はマルチタスクの再入ではなく、シングルタスクの再帰呼び出しをイメージした方が良いでしょう。
スレッドが作成した全てのウィンドウに宛てられたメッセージは、そのスレッドのメッセージキューに一緒くたに格納されます。
ご質問のケースの場合、MessageBox( )はメッセージボックスを表示した後OKボタンのクリックを検出するためのGetMessage( )/DispatchMessage( )のメッセージループを関数内に持っています。このメッセージループでメインウィンドウに宛てられたWM_TIMERが取り出されてメインウィンドウのプロシージャが呼び出され2つめのメッセージボックスが表示されます。つまりMessageBox( )呼び出しの中から再度ウィンドウプロシージャが呼び出されている再帰呼び出しの構造になっているのです。
MessageBox( )以外でもUpdateWindow( )やMoveWindow( )、SetScrollInfo( )など多くのウィンドウ操作系のAPIで、関数内部でメッセージが発行されてウィンドウプロシージャが再帰呼び出しされています。
No.1
- 回答日時:
Windowsのメッセージ機構は,特定のスレッド上で動きます。
マルチスレッド的には動きません。
ユーザーがメッセージループを明示的に書かないとメッセージはウィンドウプロシージャまで届きません。
ウィンドウメッセージはウィンドウを作成したスレッドへ届くためです。
MessageBox APIやDialogBox APIなどは,関数内部にメッセージループを持っているため,
呼び出し元のスレッドへのメッセージが問題なく呼び出されます。
http://msdn2.microsoft.com/en-us/library/ms64499 …
いろいろなところでGetCurrentThreadId APIを呼び出してみると,処理しているスレッドが変化していないことがわかるかと。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
皆さん、おはようございます♪ ...
-
最大化と最小化ボタン
-
ラジオボタンの初期指定
-
検索の画面がでなくなってしま...
-
勝手にウィンドウが開いて止ま...
-
OutlookでRSSフィードやメモの...
-
作成したウインドウのサイズを...
-
他アプリの操作(メニューバー)
-
コンソールアプリケーションで...
-
VBA .Value=.Value ?
-
C#でファイル転送プログラムWin...
-
Excelの上下を固定したい
-
MFC ダイアログ上のID取得につ...
-
Windowsプログラミングでのタス...
-
起動時のメインウィンドウのア...
-
WebBrowserでOfficeファイル等...
-
VBAでのタイトルバーの取得
-
VBでアプリケーションを自動操...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
ラジオボタンの初期指定
-
勝手にウィンドウが開いて止ま...
-
皆さん、おはようございます♪ ...
-
検索の画面がでなくなってしま...
-
Vba LongPtrについて教えてくだ...
-
【VB2008】 マウス操作の一時的...
-
[VBA] UserForm を Excel の W...
-
VBA .Value=.Value ?
-
Excelの上下を固定したい
-
UWSCで特定のChromeのタブをア...
-
ExcelのBOOKが消えた!
-
「&HFFFF」「&H1A」とは?
-
ゲームでは結局どっちが良いの?
-
作成したウインドウのサイズを...
-
エクセルで1行目から3行目が消...
-
Console.WriteLine で表示されない
-
Alt+P,Alt+NをPostmessageで送...
-
EnumChildWindowsの使い方(VBA)
おすすめ情報