2012-03-06 13 views
0

Visual Studio C++ 2010で開発されたOpenGL win32プログラムでは、何らかの問題があってもデバッグバージョンは正常に動作します。私のコードの範囲。もちろん、私が通常行っているMessageBox()を使って私のリリース版をデバッグすることができないので、これは問題です。さらに、プログラムを正しく動作させるのではなく、別の部分のコードにMessageBox()を配置すると、カーソルが砂時計/非砂時計になり、MessageBox()が表示されません。ほとんどの場合、MessageBox()コードがすべての表示フレームで呼び出されているものの、何も正しく実行されていないかのようになります。Windows MessageBoxが正しく動作するためにOpenGLが正しく動作するようにする

MessageBox()がいくつかの場所で魔法のように修正された場合、何が起こっているのかについての洞察。

+1

、それはあなたが 'メッセージボックスを()'挿入する必要がある場所に設定されたブレークポイントからスタックトレースを投稿することができれば助けて、両方のデバッグからのビルドとリリースビルドでしょう。これは、たくさんのコードを投稿することなく、わかりやすい絵を描くのに役立ちます。 – meklarian

+0

何か助けを求めたい場合は、より詳細な情報を提供する必要があります。 – Luca

答えて

1

MessageBox()には、ウィンドウメッセージメッセージを処理するためにウィンドウメッセージポンプサイクルが組み込まれています。

非常に低いレベルでアプリケーション内のどこかに、OpenGLコンテンツをホストするウィンドウのメッセージを処理するためのウィンドウメッセージループが必要です。これは、ウィンドウを作成したスレッド内から実行する必要があります。 MessageBox()が別のスレッドから呼び出されると、他の場所で見られる悪影響が競合の副作用によって簡単に引き起こされる可能性があります。

ここでは、MSDNでのウィンドウメッセージの操作の概要を示します。

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    MSG msg; 
    while(GetMessage(&msg, NULL, 0, 0) > 0) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    return msg.wParam; 
} 

ウィンドウを更新するに扱われている方法に応じて、あなたの場合:非常に単純に(wikipediaからのサンプルコードを経由して)入れ

Using Messages and Message Queues @ MSDN

は、次のように似て立っループを必要としますペイントメッセージ(WM_PAINT)を使用している場合は、できるだけ早くこれらをディスパッチする必要があります。また、デバイスDCに直接描画する場合は、それらを完全に抑制する必要があります。メッセージループが適切にセットアップされると、追加のバグが見つかる可能性があるため、これについて言及しています。私の答えにpezcodeの音符当たり

WM_PAINT message @ MSDN

+2

デバッグバージョンの違いは何ですか? – pezcode

+1

デバッグまたはリリースの実行に大きな違いはありません。 'MessageBox()'が知っていることに基づいて推論することしかできません。これにより、症状が消えてしまいます。また、ASSERT()のデバッグや、暗黙的にメッセージをポンピングするその他のデバッグ固有のコードなど、見過ごされた追加の詳細があると推測することもできます。 Opにスタックトレースを投稿するよう依頼します。おそらくコードの詳細な検査を必要とせずにこれを診断するのに役立つ情報の最も有用なビットです。 – meklarian

関連する問題