OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

プロセスとか

  • 暇なときにでも
  • 質問No.210105
  • 閲覧数88
  • ありがとう数3
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 59% (194/328)

101 case WM_CLOSE:
102  id = MessageBox(hWnd,"終了する?","",MB_YESNO);
103  if(id == IDYES)DestroyWindow(hWnd);
104 break;
105 case WM_DESTROY:
106  PostQuitMessage(0);
107 break;


103行目が実行されたら、WM_DESTROY が発生します。
そしたらそのまま104、105、106行目が順に実行されるんですか?
それとも、103が実行されたら104が実行される前に、
新しいプロセスで WM_DESTROY が入った WndProc( ) が
実行されて、それと同時に104が実行されて break で
ループが終了するんですか?
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.1

まず、プロセスというのは、この場合は関係なくて、

DestroyWindow を実行すると、内部で WndProc が呼び出されるのと同等な流れになると考えていいです。
DispatchMessage→WndProc(WM_CLOSE)→102→103→WndProc(WM_DESTROY)→106→107→return→104→return
とういうように、WM_CLOSE のメッセージを処理している途中で、WM_DESTROY が実行されます。
お礼コメント
A__

お礼率 59% (194/328)

ありがとうございます。
プロセスとスレッドがよく分かってないんです。

103行目が実行されたら、そこで、プロセスかスレッドの
ような流れAが止まって、新しい流れBが WndProc(WM_DESTROY) で
動作して、Bによって101から104は読み込まれるけど
実行されず、105で case が当てはまって 106 が実行されて
107が読み込まれて、ソースには書いてないけど WndProc( ) の
最後の return 0 が実行されてBが終了し、Aの続きが再開されて、
104から順に読み込まれて、WndProc( ) の最後の return 0 が
実行されてAが終了する。

これで合っていますか?
投稿日時 - 2002-02-04 01:23:24
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.2

>これで合っていますか? なぜスレッドにこだわるのかがわかりません。 DestroyWindow の中でカレントスレッドを一時停止させて、新しいスレッドを作成して、WndProc を呼び出すのなら、カレントスレッドがそのまま WndProc を呼び出した方が無駄な事をしないぶんだけ有利です。 >Bによって101から104は読み込まれるけど実行されず 申し訳ないのですが、読み込まれるとい ...続きを読む
>これで合っていますか?

なぜスレッドにこだわるのかがわかりません。
DestroyWindow の中でカレントスレッドを一時停止させて、新しいスレッドを作成して、WndProc を呼び出すのなら、カレントスレッドがそのまま WndProc を呼び出した方が無駄な事をしないぶんだけ有利です。

>Bによって101から104は読み込まれるけど実行されず

申し訳ないのですが、読み込まれるというのが何を意味しているのか私にはわかりません。switch-case を別の書き方をしてみると、

switch (m)
{
case WM_CLOSE:
 // 処理A
 break;
case WM_DESTROY:
 // 処理B
 break;
}



if (m == WM_CLOSE) {
 // 処理A
}
else if (m == WM_DESTROY) {
 // 処理B
}

となるわけだから、スレッドが作成されるかどうかに関係なく、実行されない部分は実行されません。
お礼コメント
A__

お礼率 59% (194/328)

ありがとうございます。
if に置きかえるやつを見て分かりました。
投稿日時 - 2002-02-05 22:50:17
  • 回答No.3
レベル8

ベストアンサー率 60% (21/35)

あまり複雑な事は考えないほうがいいと思います。 実際にはもっと複雑なんでしょうけど、WndProcを呼ぶ形としては 次の種類があると思います。 1.SendMessageのように戻りを取得するもの 2.PostMessageのようにメッセージキューに送信するだけのもの 1の場合には、inthefloiさんが言ってるように間接的にWndProc関数を呼び出す ような感じになります。 も ...続きを読む
あまり複雑な事は考えないほうがいいと思います。
実際にはもっと複雑なんでしょうけど、WndProcを呼ぶ形としては
次の種類があると思います。

1.SendMessageのように戻りを取得するもの
2.PostMessageのようにメッセージキューに送信するだけのもの

1の場合には、inthefloiさんが言ってるように間接的にWndProc関数を呼び出す
ような感じになります。
もしWndProc内から行った場合には再起呼び出しと同じようになると思います。
実際には違いますがこう考えてはどうでしょう

100 LONG DestroyWindow(...)
101 {
102  return WndProc(WM_DESTROY,...)
103 }
104 
105 LRESULT CALLBACK WndProc(...)
106 {
107  switch( uMsg )
108  {
109  case WM_CLOSE:
110    DestroyWindow(hWnd);
111  break;
112  case WM_DESTROY:
113    PostQuitMessage(0);

そうすると
WndProc(110)
 DestroyWindow(102)
  WndProc(113)
 DestroyWindow(103)
WndProc(111)

みたいな感じになると思います。
お礼コメント
A__

お礼率 59% (194/328)

ありがとうございます。
投稿日時 - 2002-02-05 22:50:12
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ