【Win32API】PeekMessageでメッセージを拾った場合にメインループの処理を行ってもいいのか

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
aridai1221
記事: 16
登録日時: 9年前

【Win32API】PeekMessageでメッセージを拾った場合にメインループの処理を行ってもいいのか

#1

投稿記事 by aridai1221 » 9年前

以下の様なコードを書きました。

コード:

 
//  コード1
MSG message;
message.message = WM_NULL;

while (message.message != WM_QUIT)
{
  if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
  {
    //  TranslateMessage関数は
    //  キーイベントを扱わないため省く
    DispatchMessage(&message);
  }

  else
  {
    //  『メインループで行いたい処理』
  }
}
PeekMessage関数でメッセージがあるかどうかを判定して
メッセージがあればDispatchMessage関数を呼び出し
メッセージがなければ『メインループで行いたい処理』を行うようにしています。

ここで、もし以下のようなコードにしたとします。

コード:

 
//  コード2
MSG message;
message.message = WM_NULL;

while (message.message != WM_QUIT)
{
  if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
  {
    //  TranslateMessage関数は
    //  キーイベントを扱わないため省く
    DispatchMessage(&message);
  }

  //  else
  {
    //  メッセージの有無に関わらずに
    //  『メインループで行いたい処理』を行うように変更した
  }
}
PeekMessage関数でメッセージを拾ったとしても
DispatchMessage関数の他に
『メインループで行いたい処理』を呼び出すというように変更しました。

MSDNのDirectXのサンプルコードでは コード1 と同じコードになっていますが、
コード2のように書くのはいけないのでしょうか。
最後に編集したユーザー aridai1221 on 2016年7月02日(土) 21:21 [ 編集 3 回目 ]

aridai1221
記事: 16
登録日時: 9年前

Re: 【Win32API】PeekMessageでメッセージを拾った場合

#2

投稿記事 by aridai1221 » 9年前

実はメッセージ関連の処理を関数にまとめてしまおうと思っています。

コード:

//	メッセージを確認する
bool checkMessage()
{
	//	終了メッセージを拾ったらループを抜けさせる
	if (message.message == WM_QUIT)
		return false;

	//	メッセージを確認する
	if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
		DispatchMessage(&message);

	return true;
}

コード:

while (checkMessage())
{
  //  『メインループで行いたい処理』
}
もしメッセージを取得できた場合でも
メインループの処理を行っても問題ないというのならば
上に示したcheckMessage関数のような実装で済むのですが、

メッセージが取得できた場合は
絶対にメインループの処理を行ってはならない
というのであれば
メッセージが取得出来たかどうかを表すフラグを用意して
フラグがたっているときには
『メインループで行いたい処理』をスキップするような処理が必要になります。

そこの実装をどうするべきなのかを知るために質問させてもらいました。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 【Win32API】PeekMessageでメッセージを拾った場合にメインループの処理を行ってもいいのか

#3

投稿記事 by みけCAT » 9年前

※勘なので間違っているかもしれません。

メッセージがあっても「メインループで行いたい処理」をした場合、
例えば「メインループで行いたい処理」で約16ms待つ処理が入っていると、
メッセージの処理が遅れ、フリーズなどの問題が起こるリスクが上がりそうな気がしました。

以下のように、「メッセージが拾えなくなるまで『メインループで行いたい処理』に行かない」というのはどうでしょうか?

コード:

//	メッセージを確認する
bool checkMessage()
{

	while (PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
	{
		DispatchMessage(&message);

		//	終了メッセージを拾ったらループを抜けさせる
		if (message.message == WM_QUIT)
			return false;
	}

	return true;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

aridai1221
記事: 16
登録日時: 9年前

Re: 【Win32API】PeekMessageでメッセージを拾った場合にメインループの処理を行ってもいいのか

#4

投稿記事 by aridai1221 » 9年前

>> みけCAT さん
返信、コードありがとうございます。
参考にさせてもらいます。

aridai1221
記事: 16
登録日時: 9年前

Re: 【Win32API】PeekMessageでメッセージを拾った場合にメインループの処理を行ってもいいのか

#5

投稿記事 by aridai1221 » 9年前

みけCATさんの方法で実装できましたので
このトピックを解決ということにさせていただきます。

ちなみに...
もしやと思い、DXライブラリのソース
DxSystemWin.cpp の NS_ProcessMessage関数を見てきました。
みけCATさんに提示していただいたコードと同じようなコードがあるのを確認しました。
身近にいいサンプルがあるのに気づかなかった自分の愚かさに驚いてます XD
自己解決能力も鍛えるべきだなと実感しました。

いい勉強になりました。
ありがとうございました。
:)

閉鎖

“C言語何でも質問掲示板” へ戻る