ProcessMessageについて

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

ProcessMessageについて

#1

投稿記事 by だんごさん » 12年前

私は今、あるプログラムを作っています・・・。プログラム中にwihle文があるため、

コード:

while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0 ){
//プログラム
}
のように中身にProcessMessage()を入れています。
プログラムはうまく動きます。ウィンドウモードで×ボタンを押すと閉じるし、ウィンドウの移動も可能です。
ところがしばらくすると、いきなり閉じてしまいます。ウィンドウモードでもフルでも強制終了のように・・・つまり、while文を出てしまうのです。プログラムはbreakを使っておらず、上記のようにESCキーでループ脱出です。
初め、何が原因か分からず、あまり良い方法では無いのですが、上記のプログラムをさらにwhile文で囲み、条件にProcessMessage()==0とEnterで脱出 を入れました。はっきり言ってESCキーを押してもその時点でエンターを押していないと二度と終了できない感じです。
ところがそのwhile文をも無視して終了しました。

勝手に強制終了してしまう原因はプログラムなのかPCの問題なのか分かりません。
またProcessMessageは関係ないのでしょうか?
ヒントでも良いので、よろしくお願いします。


腕は初心者です。
環境
OS: Windows7
コンパイラ名 :VC++ 2008EE
 Dango San

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ProcessMessageについて

#2

投稿記事 by softya(ソフト屋) » 12年前

とりあえず全コードを見せてもらわないとなんとも言えないですね。
whileがある設計そのものに問題がある気もしますが、原因が分からずに応急処置をしても原因は消えてくれませんので再現しているんだと思います。
あと実行時に作られるLog.txtの内容も添付して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

だんごさん
記事: 273
登録日時: 12年前

Re: ProcessMessageについて

#3

投稿記事 by だんごさん » 12年前

とりあえずLog.txtを。

おお、Logを見ますと発見が・・・。
------------------------------------------------------------
530:最大テクスチャサイズ 幅:8192 高さ:8192
530:テクスチャステージテンポラリレジスタ:使用可
531:減算合成のハードウェア対応:ネイティブ
531:頂点シェーダーバージョンコード:300
531:ピクセルシェーダーバージョンコード:300
539:バックバッファロック転送の時間:59nsec 一時的な描画可能バッファを使用した転送の時間:413nsec
540:バックバッファロックを使用します
540:Zバッファを作成します.... 成功
545:プログラマブルシェーダーを使用します

593:フォントの初期化を行います
594:フォントの初期化は正常に終了しました
605:文字コードバッファの初期化を行います... 完了しました
84429:グラフィックの数が許容量を越えました終了します  ←ここ問題?
84429:フォントの初期化を行います
84431:フォントの初期化は正常に終了しました
84671:Direct3DDevice9 の解放 3
85103:Direct3D9 DLL の解放 4
85106:DirectInput 関連の終了処理... 完了
85135:DirectSound の終了処理は正常に終了しました
85137:ウインドウを閉じようとしています
85139:ウインドウが破棄されようとしています
85139:ソフトを終了する準備が整いました
85157:
85157:Alloc memory dump
85157: Total size:0(0.000kb) Alloc num:0
85157:
--------------------------------------------------------

個人情報が載ってそうな感じでしたので、問題の部分だけを・・・。もし個人情報は漏れない、又はここだけは伏せて・・・といった要望がありましたら、載せます。


えーと、どうもグラフィック数が超えたようです。どの程度までなら許容量を超えないでしょうか?
 Dango San

アバター
SUE
記事: 41
登録日時: 12年前

Re: ProcessMessageについて

#4

投稿記事 by SUE » 12年前

私は許容量について知りませんが、この場合具体的な数は直接は関係ないと思われます。
恐らく、while文をループするたびに同じグラフィックの確保関数を呼び出しているのではないでしょうか? そうであれば、最初の1ループだけ確保関数が呼ばれるようにする必要があります。
pop'n music 20 fantasia ポップンクエストPhase MAX Ⅱ ムラクモ/少年は空を辿る【Power Of Nature】

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: ProcessMessageについて

#5

投稿記事 by bitter_fox » 12年前

だんごさん さんが書きました:とりあえずLog.txtを。

えーと、どうもグラフィック数が超えたようです。どの程度までなら許容量を超えないでしょうか?
ゲームループ内でLoadGraph等を呼び出していませんか?
ループ毎に読み込まれてしまい、許容量を超えてしまいます。

だんごさん
記事: 273
登録日時: 12年前

Re: ProcessMessageについて

#6

投稿記事 by だんごさん » 12年前

bitter_fox さんが書きました:ゲームループ内でLoadGraph等を呼び出していませんか?    
ループ毎に読み込まれてしまい、許容量を超えてしまいます。
どうもvoidなどの関数内で使用していたようです。
直してみますのでお待ちください。
 Dango San

だんごさん
記事: 273
登録日時: 12年前

Re: ProcessMessageについて

#7

投稿記事 by だんごさん » 12年前

コード:

int Handle3 = LoadGraph("○○○○.png");
を関数の外に出し、実行してみました。
ところが今度は××××は動作を停止しました。とエラーメッセージがウィンドウズ側から出てきて、実行できません。
度々なる問題、申し訳ございません。

[追記]
これは題名と内容が違ってきていますがそのままで良いでしょうか?
 Dango San

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: ProcessMessageについて

#8

投稿記事 by bitter_fox » 12年前

だんごさん さんが書きました:

コード:

int Handle3 = LoadGraph("○○○○.png");
を関数の外に出し、実行してみました。
ところが今度は××××は動作を停止しました。とエラーメッセージがウィンドウズ側から出てきて、実行できません。
度々なる問題、申し訳ございません。
int Handle3 = LoadGraph(...);はグローバル領域にあるのでしょうか?
DxLib_Initが呼び出されるよりも先にLoadGraphなどが呼び出されると動作が停止するというメッセージが表示されます。
グローバル領域はエントリーポイント(WinMain)よりも先に実行されるのでこのような状態になっているのだと思います。

初期化はゲームループの前か、ゲームループ内で最初の一回だけ行われるようにしてください。
参考: http://dixq.net/rp/6.html
だんごさん さんが書きました: [追記]
これは題名と内容が違ってきていますがそのままで良いでしょうか?
このままでよいと思います。

だんごさん
記事: 273
登録日時: 12年前

Re: ProcessMessageについて

#9

投稿記事 by だんごさん » 12年前

コード:

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){     
	
	    ChangeWindowMode( TRUE );// ウィンドウモードに設定
            DxLib_Init();   // DXライブラリ初期化処理
		  		
         ▵▵▵▵(); ①
		DxLib_End();    // DXライブラリ終了処理
        return 0;
}
①の関数に別のソースファイルで作成した関数(LoadGraphで問題になった)を入れています。
この場合でも動作を停止してしまうので問題があるのですよね?
 Dango San

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ProcessMessageについて

#10

投稿記事 by softya(ソフト屋) » 12年前

プログラムの流れとして、DxLib_Init(); 後にしかLoadGraph()してはいけません。
なので変数宣言と同時にロードすることは出来ません。
そして、ループの中に入れるとロードを繰り返してメモリが足らなくなるかロード限界数に達します。
DxLib_Init();後でループに入る前がロードして良い場所となります。

あとwhileが幾つもあるのはマズイので次の説明をよく読んでみてください。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]  補足資料.11章 書いてはいけない4つの処理 」
http://dixq.net/g/h_11.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

だんごさん
記事: 273
登録日時: 12年前

Re: ProcessMessageについて

#11

投稿記事 by だんごさん » 12年前

原因となっていたvoid関数内のLoadGraphについて。
これについては
bitter_fox さんが書きました:初期化はゲームループの前か、ゲームループ内で最初の一回だけ行われるようにしてください。参考: http://dixq.net/rp/6.html
の参考URLより、プログラムを改正しました。
またこちらのプログラムの都合により、extern文で別ファイルからロードされた画像を引き出すことにしました。
結果、ループによる過度なロードは行われず、無事強制終了なく実行されました。
よって解決いたしましたので報告いたします。
ありがとうございました。
 Dango San

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ProcessMessageについて

#12

投稿記事 by softya(ソフト屋) » 12年前

書かれていないのですが、「補足資料.11章 書いてはいけない4つの処理」に該当する部分がある場合は将来的に問題を引き起こす可能性が高いので今の内に修正しておくことをお勧めします。無いのなら良いのですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

だんごさん
記事: 273
登録日時: 12年前

Re: ProcessMessageについて

#13

投稿記事 by だんごさん » 12年前

記載されておらず申し訳ございません。
現在、私のプログラムでは該当する書いてはいけない処理は含まれておりません。
以前書いていたwhile文の複数存在についても改正いたしました。
 Dango San

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ProcessMessageについて

#14

投稿記事 by softya(ソフト屋) » 12年前

だんごさん さんが書きました:記載されておらず申し訳ございません。
現在、私のプログラムでは該当する書いてはいけない処理は含まれておりません。
以前書いていたwhile文の複数存在についても改正いたしました。
なるほど。心配しすぎました。
引き続きゲーム作りを楽しんで下さい。また、疑問がありましたらお気軽にどうぞ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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