2

私の問題は、ゲームを閉じるときに、次の 2 つのうちのいずれかが発生する場合があることです。

  1. プロセスはメモリに残り、手動で強制終了する必要があります
  2. ゲームがクラッシュする

これら 2 つの問題が関連しているのか、それとも完全に独立した問題なのかはわかりません。どちらもめったに起こりませんが、これらの状況を排除する必要があります。

クラッシュに関しては、ダンプを作成したところ、PeekMessage() 関数でクラッシュが発生したとのことです。コードは次のようになります。

bool running = true;

/// Reset timer
Timer.Reset();

MSG msg;
ZeroMemory(&msg, sizeof(msg));

/// message pump
while(running)
{
    int msg_count = 10;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) && msg_count-->0)
    {
        ::TranslateMessage(&msg);
        ::DispatchMessage(&msg);

        if (msg.message == WM_QUIT)
        {
            running = false;
            break;
        }
    }

    if (ApplicationActive)
    {
        PrepareFrame();
        RenderFrame();
    }
    else
        Sleep(1);

    Sleep(1);
}

私が見たところ、メッセージ処理ルーチンは、ループの反復ごとに最大 10 個のメッセージを処理しています。クラッシュがメッセージ キューのオーバーフローの結果である可能性はありますか? そして、プロセスがメモリにとどまっているのは、キュー内で遠すぎるため、「到達していない」終了メッセージの結果ですか? それが役立つ場合は、ダンプからのコール スタックを次に示します。

ntdll.dll!_KiFastSystemCallRet@0()  
ntdll.dll!_ZwWaitForSingleObject@12()  + 0xc bytes  
ntdll.dll!_RtlpWaitOnCriticalSection@8()  + 0xc8 bytes  
ntdll.dll!_RtlEnterCriticalSection@4()  - 0x4b84 bytes  
ntdll.dll!_LdrLockLoaderLock@12()  + 0x6b bytes 
ntdll.dll!_LdrLoadDll@16()  + 0xd8 bytes    
kernel32.dll!_LoadLibraryExW@12()  + 0xf7 bytes 
user32.dll!___ClientLoadLibrary@4()  + 0x60 bytes   
ntdll.dll!_KiUserCallbackDispatcher@12()  + 0x2e bytes  
user32.dll!_NtUserPeekMessage@20()  + 0xc bytes 
user32.dll!__PeekMessage@24()  + 0x2d bytes 
user32.dll!_PeekMessageA@20()  + 0x572 bytes    

SchoolBus.exe!VCasualApp::Run() 229 行目 + 0x12 バイト C++ SchoolBus.exe!wWinMain(HINSTANCE__ * formal=0x00400000, HINSTANCE * formal=0x00400000,HINSTANCE * formal=0x00400000,HINSTANCE * formal=0x00400000) 61 行目 C++ SchoolBus .exe!__tmainCRTStartup() 行 578 + 0x1c バイト C kernel32.dll!@BaseThreadInitThunk@12() + 0x12 バイト
ntdll.dll!
RtlUserThreadStart@8() + 0x27 バイト
ntdll.dll!
_RtlUserThreadStart@8() + 0x1b バイト

4

0 に答える 0