私の問題は、ゲームを閉じるときに、次の 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 バイト