• ベストアンサー

プロセスとか

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 で ループが終了するんですか?

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

  • ベストアンサー
noname#30727
noname#30727
回答No.1

まず、プロセスというのは、この場合は関係なくて、 DestroyWindow を実行すると、内部で WndProc が呼び出されるのと同等な流れになると考えていいです。 DispatchMessage→WndProc(WM_CLOSE)→102→103→WndProc(WM_DESTROY)→106→107→return→104→return とういうように、WM_CLOSE のメッセージを処理している途中で、WM_DESTROY が実行されます。

A__
質問者

お礼

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

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • akinori_s
  • ベストアンサー率60% (21/35)
回答No.3

あまり複雑な事は考えないほうがいいと思います。 実際にはもっと複雑なんでしょうけど、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__
質問者

お礼

ありがとうございます。

すると、全ての回答が全文表示されます。
noname#30727
noname#30727
回答No.2

>これで合っていますか? なぜスレッドにこだわるのかがわかりません。 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__
質問者

お礼

ありがとうございます。 if に置きかえるやつを見て分かりました。

すると、全ての回答が全文表示されます。

関連するQ&A