ページ 1 / 1
ProcessMessageについて
Posted: 2012年1月31日(火) 19:14
by だんごさん
私は今、あるプログラムを作っています・・・。プログラム中に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
Re: ProcessMessageについて
Posted: 2012年1月31日(火) 19:29
by softya(ソフト屋)
とりあえず全コードを見せてもらわないとなんとも言えないですね。
whileがある設計そのものに問題がある気もしますが、原因が分からずに応急処置をしても原因は消えてくれませんので再現しているんだと思います。
あと実行時に作られるLog.txtの内容も添付して下さい。
Re: ProcessMessageについて
Posted: 2012年1月31日(火) 19:51
by だんごさん
とりあえず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:
--------------------------------------------------------
個人情報が載ってそうな感じでしたので、問題の部分だけを・・・。もし個人情報は漏れない、又はここだけは伏せて・・・といった要望がありましたら、載せます。
えーと、どうもグラフィック数が超えたようです。どの程度までなら許容量を超えないでしょうか?
Re: ProcessMessageについて
Posted: 2012年1月31日(火) 20:05
by SUE
私は許容量について知りませんが、この場合具体的な数は直接は関係ないと思われます。
恐らく、while文をループするたびに同じグラフィックの確保関数を呼び出しているのではないでしょうか? そうであれば、最初の1ループだけ確保関数が呼ばれるようにする必要があります。
Re: ProcessMessageについて
Posted: 2012年1月31日(火) 20:06
by bitter_fox
だんごさん さんが書きました:とりあえずLog.txtを。
えーと、どうもグラフィック数が超えたようです。どの程度までなら許容量を超えないでしょうか?
ゲームループ内でLoadGraph等を呼び出していませんか?
ループ毎に読み込まれてしまい、許容量を超えてしまいます。
Re: ProcessMessageについて
Posted: 2012年1月31日(火) 20:29
by だんごさん
bitter_fox さんが書きました:ゲームループ内でLoadGraph等を呼び出していませんか?
ループ毎に読み込まれてしまい、許容量を超えてしまいます。
どうもvoidなどの関数内で使用していたようです。
直してみますのでお待ちください。
Re: ProcessMessageについて
Posted: 2012年1月31日(火) 20:38
by だんごさん
コード:
int Handle3 = LoadGraph("○○○○.png");
を関数の外に出し、実行してみました。
ところが今度は××××は動作を停止しました。とエラーメッセージがウィンドウズ側から出てきて、実行できません。
度々なる問題、申し訳ございません。
[追記]
これは題名と内容が違ってきていますがそのままで良いでしょうか?
Re: ProcessMessageについて
Posted: 2012年1月31日(火) 20:47
by bitter_fox
だんごさん さんが書きました:コード:
int Handle3 = LoadGraph("○○○○.png");
を関数の外に出し、実行してみました。
ところが今度は××××は動作を停止しました。とエラーメッセージがウィンドウズ側から出てきて、実行できません。
度々なる問題、申し訳ございません。
int Handle3 = LoadGraph(...);はグローバル領域にあるのでしょうか?
DxLib_Initが呼び出されるよりも先にLoadGraphなどが呼び出されると動作が停止するというメッセージが表示されます。
グローバル領域はエントリーポイント(WinMain)よりも先に実行されるのでこのような状態になっているのだと思います。
初期化はゲームループの前か、ゲームループ内で最初の一回だけ行われるようにしてください。
参考:
http://dixq.net/rp/6.html
だんごさん さんが書きました:
[追記]
これは題名と内容が違ってきていますがそのままで良いでしょうか?
このままでよいと思います。
Re: ProcessMessageについて
Posted: 2012年1月31日(火) 21:00
by だんごさん
コード:
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode( TRUE );// ウィンドウモードに設定
DxLib_Init(); // DXライブラリ初期化処理
▵▵▵▵(); ①
DxLib_End(); // DXライブラリ終了処理
return 0;
}
①の関数に別のソースファイルで作成した関数(LoadGraphで問題になった)を入れています。
この場合でも動作を停止してしまうので問題があるのですよね?
Re: ProcessMessageについて
Posted: 2012年1月31日(火) 21:44
by softya(ソフト屋)
プログラムの流れとして、DxLib_Init(); 後にしかLoadGraph()してはいけません。
なので変数宣言と同時にロードすることは出来ません。
そして、ループの中に入れるとロードを繰り返してメモリが足らなくなるかロード限界数に達します。
DxLib_Init();後でループに入る前がロードして良い場所となります。
あとwhileが幾つもあるのはマズイので次の説明をよく読んでみてください。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ] 補足資料.11章 書いてはいけない4つの処理 」
http://dixq.net/g/h_11.html
Re: ProcessMessageについて
Posted: 2012年2月01日(水) 18:36
by だんごさん
原因となっていたvoid関数内のLoadGraphについて。
これについては
の参考URLより、プログラムを改正しました。
またこちらのプログラムの都合により、extern文で別ファイルからロードされた画像を引き出すことにしました。
結果、ループによる過度なロードは行われず、無事強制終了なく実行されました。
よって解決いたしましたので報告いたします。
ありがとうございました。
Re: ProcessMessageについて
Posted: 2012年2月01日(水) 18:40
by softya(ソフト屋)
書かれていないのですが、「補足資料.11章 書いてはいけない4つの処理」に該当する部分がある場合は将来的に問題を引き起こす可能性が高いので今の内に修正しておくことをお勧めします。無いのなら良いのですが。
Re: ProcessMessageについて
Posted: 2012年2月01日(水) 18:47
by だんごさん
記載されておらず申し訳ございません。
現在、私のプログラムでは該当する書いてはいけない処理は含まれておりません。
以前書いていたwhile文の複数存在についても改正いたしました。
Re: ProcessMessageについて
Posted: 2012年2月01日(水) 18:50
by softya(ソフト屋)
だんごさん さんが書きました:記載されておらず申し訳ございません。
現在、私のプログラムでは該当する書いてはいけない処理は含まれておりません。
以前書いていたwhile文の複数存在についても改正いたしました。
なるほど。心配しすぎました。
引き続きゲーム作りを楽しんで下さい。また、疑問がありましたらお気軽にどうぞ。