VC++でゲーム開発をしています。
基本的には「デバッグなしで開始」を選択して動作確認しているのですが、たまに間違って「デバッグの開始」を選択してしまうとフリーズしてしまいます。OSごとフリーズするのでアプリケーションの強制終了もできず、pcの電源を落とすしかありません。おそらくゲームループ(ShowWindow()でした)によるものだと思います。これを防ぐ方法、あるいはフリーズ時の対処法はありますか?気を付けるしかないのでしょうか。
追記:以下のコードで「デバッグの開始」をすると必ずフリーズします。ShowWindow(hwnd, SW_SHOW);をコメントアウトするとフリーズせず正常にデバッグが開始できました。正常な環境であれば以下のコードでフリーズは起こらないのでしょうか?それとも、そもそもこのコード自体にどこかおかしい点がありますか?
c++
1#include <Windows.h> 2#include <tchar.h> 3 4LRESULT WindowProcedure(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { 5 if (msg == WM_DESTROY) { 6 PostQuitMessage(0); 7 return 0; 8 } 9 return DefWindowProcW(hwnd, msg, wparam, lparam); 10} 11 12int main() 13{ 14 //create window 15 HWND hwnd = nullptr; 16 WNDCLASSEX wc = {}; 17 HINSTANCE hInstance = GetModuleHandle(nullptr); 18 wc.cbSize = sizeof(WNDCLASSEX); 19 wc.lpfnWndProc = (WNDPROC)WindowProcedure; 20 wc.lpszClassName = _T("2Dgame"); 21 wc.hInstance = GetModuleHandle(nullptr); 22 RegisterClassEx(&wc); 23 RECT wrect = { 0,0,1280,720 }; 24 AdjustWindowRect(&wrect, WS_OVERLAPPEDWINDOW, false); 25 hwnd = CreateWindow( 26 wc.lpszClassName, 27 _T("game window"), 28 WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU, 29 CW_USEDEFAULT, 30 CW_USEDEFAULT, 31 wrect.right - wrect.left, 32 wrect.bottom - wrect.top, 33 nullptr, 34 nullptr, 35 wc.hInstance, 36 nullptr 37 ); 38 ShowWindow(hwnd, SW_SHOW); 39 40 //loop 41 MSG msg = {}; 42 while (true) 43 { 44 if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) { 45 if (msg.message == WM_QUIT) { 46 break; 47 } 48 TranslateMessage(&msg); 49 DispatchMessage(&msg); 50 } 51 else { 52 //game processing 53 } 54 } 55}
まず「Visual Studio デバッグ フリーズ」で検索するとフリーズの原因と対処法が色々みつかるので、それを試してください。
それでも改善しない場合、OS と Visual Studio を再インストールし、同じ問題が再現するかを確認しながら他のアプリや設定を少しずつ戻して原因究明をしてください。
デバッグできない開発環境など効率が悪いにもほどがあります。
それでも改善せず、別の環境を用意することもできない場合、メニューを使うのをやめてキーボードショートカットから開始する癖をつければ間違えないのではないかと思います。
というか、ここで聞くことでしょうか?
一番にサポートに電話するのが良いかもしれません。
> おそらくゲームループによるものだと思います
Visual Studio 側の問題なのか,自分のプログラム側が何か良くないのか,という切り分けをしてみてはどうでしょうか?
てきとーな別のプロジェクトを作ってみても同じことになるなら前者側だと判断,とか.
Zuishin様
過去にも何度も調べましたが解決しませんでした。Visual Studioを再インストールしても駄目でした。ショートカットも使いますが、F5に手が当たってフリーズすることもあるので直したいです。OSの再インストールやサポートへの連絡は最終手段にします。。。
fana様
適当なコードを追記しました。このコードでフリーズします。よくあるゲームループだと思うのですがどこか間違っているのでしょうか。
たとえそのコードのどこかが間違っていたとして,それによってOSを巻き込んでフリーズというのはそうそう無いだろうと思うので,やはりコードとは関係ないんじゃないでしょうか?
(コンソールアプリケーションでmain関数で即returnするだけのコードとかで試せば「コードが間違っているから?」的な懸念も無くなるのでは)
ショートカットは再割り当てできるので、デバッグ実行のショートカットを削除し、デバッグなしで実行に F5 を割り当てれば一応望みの動作にはなると思います。
デバッグできない IDE というわけのわからないものになりますが。
あなたの回答
tips
プレビュー