「Windows API/イベントドリブン方式」の版間の差分

削除された内容 追加された内容
編集の要約なし
103 行
 
== イベントドリブン方式をやめたい場合 ==
伝聞では、PeekMessage() 関数を使うと、イベントドリブン方式はやめられ事になと言われており、(かつてのMS-DOSやBASICのような)手続き型のような処理になると言われています。
 
PeekMessage() 関数とは、マイクロソフト社の仕様用上では、イベントからのメッセージを待たずに、制御を実行するという関数です。なので理屈上は、PeekMessage() 関数でイベントドリブン方式をやめることができるだろう、と考えられています。
 
ですが、実際の実装があまりよくなく、PeekMessage() 関数を用いたアプリケーションがしばしば動作停止をするので、あまりイベントドリブン方式をやめる事を試みるのは、すすめられません。
さて、WindowsAPIの起動時にVisual Studio の自動作成するコードをよく見ると、
 
どうも、Visual C++ でイベント・ドリブン方式をやめる事は、マイクロソフト的にはサポートされていないようです。
 
どうしてもPeekMessage() 関数を使う場合、使い方は下記の通りです。
 
=== 手法 ===
さて、WindowsAPIの起動時にVisual Studio の自動作成するコードをよく見ると、
<syntaxhighlight lang="C">
MSG msg;
125 ⟶ 133行目:
というような感じのコードが、最初から作成されています(Visual Studioのバージョンによって多少の差異の可能性あり)。
 
コード中のGetMessage() 関数を除去、おおむね次のコードのようにPeekMessage() 関数に置き換えれば
 
:例
161 ⟶ 169行目:
一方、GetMessage() 関数のままの場合なら、メッセージの到着を待って処理をしていく方式になるので、「イベントドリブン方式でループをしていく」と宣言していることになります。
 
<!-- DirectX系のゲームなどのプログラミングの場合、プレイヤーの入力を待たずに画面などが更新され続けますが、それらの機能は一般に PeekMessage() 関数に置き換えることによって実装されるといわれています。← 実機で確認したところ、疑わしい。ネットではそう言われてるが、しかしアプリがフリーズを多発する。 -->
 
 
198 ⟶ 206行目:
return (int)msg.wParam;
</syntaxhighlight>
 
 
 
 
 
263 ⟶ 268行目:
return (int)msg.wParam;
</syntaxhighlight>
 
 
;注意
上述のこれらのコードは、実際にelseブロック内に図形の描画を描くなどの処理をすると、コンパイルは可能ですが、フリーズを多発します。
 
また、動作の開始直後は動きますが、しばらく秒数が経つと、動作停止をすることがあります。