• ベストアンサー

ウィンドウ内でマウスが乗ると更新が止まります・・

ウィンドウプロシージャ周りを触っているのですが、  ・ウィンドウにマウスが乗っていつつ、マウスが動いている時  ・キーボードーを押した瞬間 にメインループに処理が回らず 全体の処理が止まってしまいます。 上の問題を解決するには、どうすれば良いでしょうか? ※以下コード ---------------------------------------------- while(TRUE) { if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if(msg.message == WM_QUIT) { break; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } else { // 処理メッセージが無いとき WINDOWPLACEMENT wndpl; GetWindowPlacement(hWnd, &wndpl); if((wndpl.showCmd != SW_HIDE) && (wndpl.showCmd != SW_MINIMIZE) && (wndpl.showCmd != SW_SHOWMINIMIZED) && (wndpl.showCmd != SW_SHOWMINNOACTIVE)) { ... ゲームのような、常時更新が必要なループ処理 ... } } Sleep(1); // 最小化等でフリーズしないため } ---------------------------------------------- //以下メッセージ処理側の一部 case WM_KEYDOWN: if (wParam == VK_ESCAPE) { PostQuitMessage(0); } break; case WM_MOUSEMOVE: return DefWindowProc(hWnd, msg, wParam, lParam); default: return DefWindowProc(hWnd, msg, wParam, lParam); ---------------------------------------------- また、ゲームなどのリアルタイム更新に向いた ウィンドウプロシージャの作り方などの説明サイト等ご存知でしたら そちらも教えて頂けると幸いです。

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.3

すでに回答付いているとおり、スレッドにして別処理させるべきかと。 メッセージのいくつかはスレッド間通信などで処理する必要があるかもしれませんが。 で、なぜ「全体の処理が止まってしまいます。」なのかは… spy++で該当ウィンドウのメッセージをフィルタせずに監視すれば分かるでしょう。 激しくメッセージが流れている間は「全体の処理が止まってしまいます。」です。 メッセージ処理していますからね。 マウスカーソルちょっと動かすだけでも大量のメッセージが流れていることを実感できるでしょう。 # WM_NCMOUSEMOVE/WM_NCHITTEST/WM_MOUSEMOVE/WM_HITTEST/WM_SETCURSOR等々

zaxs5968
質問者

お礼

ご回答ありがとうございます。 >spy++ そういう物で監視できるのですね。 >激しくメッセージが流れている間は「全体の処理が止まってしまいます。」 まさにこの状態でした。 そしてこの場を借りて、 お3方様ありがとうございます。 頂いた情報から、メッセージ処理を少しは理解できたようで、 if(msg.message == WM_QUIT) { break; } の後に else if(msg.message == WM_KEYDOWN) { メインループ; } else if(msg.message == WM_MOUSEMOVE) { メインループ; } と書き足す事で 今回の問題は解決できました。 別の問題点が有るかもしれませんが、仕組みが掴めて来た気がします。 お3方様、ありがとうございましたっ!

その他の回答 (2)

回答No.2

ウィンドウプロシージャで全て処理しようとしてるのが問題のようです。 >... ゲームのような、常時更新が必要なループ処理 ... この部分を全てスレッド化しましょう。 メッセージは蓄積するので、そこでもたついてると 他の処理が全然走りませんよ。 ウィンドウプロシージャはあくまでも ウィンドウに関するイベントを処理するとこです。

zaxs5968
質問者

お礼

ご回答ありがとうございます。 頂いた助言のおかげで、大まかに何が間違えてるか理解できました。 感謝っ

回答No.1

 こんにちは。  う~ん、無理が有る様な気がします。  ゲーム用のメッセージループで、  http://www.sm.rim.or.jp/~shishido/mainloop.html  アイドリング時に  「GetKeyboardState()」  http://msdn.microsoft.com/ja-jp/library/cc364674.aspx  又は、DirectInputでキー入力を拾った方が良いのではないでしょうか。  当方が読んで来たゲーム書籍も、結局そんな感じで処理していました。  GetKeyboardState()とDirectInputは良く似ていますが、GetKeyboardState()の方が遥かに簡単に出来ると思います。

zaxs5968
質問者

お礼

ご回答ありがとうございます。 キー入力はDirectInputで取得していたのですが、 メッセージの処理まわりが継ぎ接ぎで、よく解らなくなっていました。 無事解決できました、ありがとうございました