TheReclif Temat założony przez niniejszego użytkownika |
[CPP] [WinAPI] Dziwny przebieg działania programu » 2015-03-28 23:58:29 Witam! Eksperymentuję trochę z DirectX 11 i postanowiłem napisać prostą aplikację, żeby zobaczyć, czy dobrze wszystko robię z kursu. Z założenia ma się wyświetlić na cały ekran i zamknąć dopiero wtedy, gdy nacisnę na klawisz Escape bądź krzyżyk(którego nie ma ze względu na styl okna). Kod: #include <mainGlow.h> #define WIN32_LEAN_AND_MEAN
#define DEBUG
static GlowAPI::System::handlingClass * hc = new GlowAPI::System::handlingClass; static GlowAPI::DirectX::DX3D11AppClass * DXClass = new GlowAPI::DirectX::DX3D11AppClass;
void GlowAPI::DirectX::DX3D11AppClass::messageFunc() { MSG msg; bool done; ZeroMemory( & msg, sizeof( MSG ) ); done = false; while( !done ) { if( PeekMessage( & msg, NULL, 0, 0, PM_REMOVE ) ) { TranslateMessage( & msg ); DispatchMessage( & msg ); } if( msg.message == WM_QUIT ) { done = true; } else if( msg.message == WM_KEYDOWN ) { if( hc->isKeyDown( VK_ESCAPE ) ) { done = true; } } else { fillScreen(); updateScreen(); } } throw STATUS_EXIT; }
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) { try { const int resW = 800; const int resH = 600; GlowAPI::System::systemSettings sysSetts; sysSetts.fullscreen = true; sysSetts.showCmd = nShowCmd; sysSetts.showCursor = true; sysSetts.winClassName = "Model Viewer WinClass"; sysSetts.winName = "Model Viewer"; sysSetts.instance = hInstance; hc->init( sysSetts ); hc->showWindow(); GlowAPI::DirectX::DXSettings setts( resW, resH, hc->getWin() ); setts.fullscreen = sysSetts.fullscreen; setts.vSync = false; DXClass->initDX11( setts ); DXClass->fillScreen(); DXClass->updateScreen(); DXClass->messageFunc(); return 0; } catch( int errorCode ) { if( errorCode != STATUS_EXIT ) { return GlowAPI::System::defaultErrorOutput( errorCode ); } else { #ifdef DEBUG MessageBox( NULL, "Exit with status 0x0!", "Congratulations! Exit status 0x0!", MB_ICONASTERISK | MB_OK ); #endif PostQuitMessage( 0 ); DXClass->shutdownDX11(); hc->wndEnd(); delete hc; hc = NULL; delete DXClass; DXClass = NULL; return 0; } } }
A jak w praktyce wygląda praca programu? Owszem, włącza się, przechodzi w tryb pełnoekranowy i... jest. Naciskam Escape i się zamyka. Słyszę dźwięk MessageBox-a informującego o tym, że udało się normalnie wyjść z programu(tzn. zwrócić 0). Ale jak naciskam OK, od razu słyszę inny dźwięk: MessageBox-a informującego o błędzie! Tylko że nigdzie go nie widzę. Większy cyrk robi się wtedy, gdy podczas korzystania z programu używam kombinacji ALT + TAB lub naciskam przycisk myszy. Okienko znika... ale proces cały czas istnieje. I zżera aż 25% procesora! To niedorzeczne! Proszę pisać, gdyby był potrzebny większy kawałek kodu lub cokolwiek innego. Czy można to rozwiązać? Z góry dziękuję za pomoc! |
|
pekfos |
» 2015-03-29 12:55:01 To cały twój kod? |
|
TheReclif Temat założony przez niniejszego użytkownika |
» 2015-03-29 22:28:49 Kodu jest ok. 600 linijek. Jakich funkcji i klas kod dać? |
|
Brunon3 |
» 2015-03-29 22:30:26 600 linijek... To nie tak aż tak dużo. :P Jak chcesz możesz wrzucić gdzieś cały projekt to może ktoś zerknie. ;)
-BD. |
|
TheReclif Temat założony przez niniejszego użytkownika |
» 2015-03-30 19:11:14 |
|
Monika90 |
» 2015-03-30 19:30:23 lpstr convertToLpstr( string target ) { lpcstr temp = target.c_str(); lpstr result = const_cast < lpstr >( temp ); return result; }
koszmar |
|
TheReclif Temat założony przez niniejszego użytkownika |
» 2015-03-30 20:17:25 Funkcja convertToLpstr tak naprawdę jest w ogóle nie używana. Szczerze: nie wiem, czemu ją napisałem. Ale mam na przyszłość przykład, jak nie pisać funkcji. |
|
RazzorFlame |
» 2015-03-30 20:30:21 A jak w praktyce wygląda praca programu? Owszem, włącza się, przechodzi w tryb pełnoekranowy i... jest. Naciskam Escape i się zamyka. Słyszę dźwięk MessageBox-a informującego o tym, że udało się normalnie wyjść z programu(tzn. zwrócić 0). Ale jak naciskam OK, od razu słyszę inny dźwięk: MessageBox-a informującego o błędzie! Tylko że nigdzie go nie widzę. Większy cyrk robi się wtedy, gdy podczas korzystania z programu używam kombinacji ALT + TAB lub naciskam przycisk myszy. Okienko znika... ale proces cały czas istnieje. I zżera aż 25% procesora! To niedorzeczne! Proszę pisać, gdyby był potrzebny większy kawałek kodu lub cokolwiek innego. Czy można to rozwiązać? Z góry dziękuję za pomoc! |
Może od początku. Jaki error dostajesz? Jaki kod błędu. Bój się boga, dlaczego w ten sposób piszesz kod. Nie mam nic do Ciebie, ale jak widzę taki kod to aż mnie męczy. Poczytaj o dzieleniu kodu na .hpp i .cpp oraz spróbuj nie dawać wszystkiego do jednej klasy. Masz 4 rdzeniowy (lub wątkowy) procesor to się nie dziw, że zżera tyle procesora. Gdyby był 2-wątkowy to by zżerało 50%, tak już po prostu jest. Jak zobaczysz na inne gry, to wiele z nich zabiera właśnie tyle procka. Masz źle zaprogramowany message loop. Nie powinieneś w ten sposób odbierać zdarzeń, tylko napisać własną funkcję zastępującą DefWindowProc, i wtedy to zrobić. Tak u mnie to wygląda: LRESULT CALLBACK AbstractWindow::DefaultProcedure( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { AbstractWindow * pWnd = nullptr; if( uMsg == WM_NCCREATE ) { SetWindowLong( hwnd, GWLP_USERDATA,( long )(( LPCREATESTRUCT( lParam ) )->lpCreateParams ) ); } pWnd = GetObjectFromWindow( hwnd ); if( pWnd != nullptr ) { return pWnd->defaultProcedure( hwnd, uMsg, wParam, lParam ); } return DefWindowProc( hwnd, uMsg, wParam, lParam ); }
AbstractWindow * AbstractWindow::GetObjectFromWindow( HWND hWnd ) { return reinterpret_cast < AbstractWindow *>( GetWindowLongPtr( hWnd, GWLP_USERDATA ) ); }
Edit: Miałem dokładnie ten sam zestaw problemów co ty, też się dziwiłem. Ten temat może być przydatnyNa szczęście uporałem się z problemem i mam dość dużą część silnika w tym momencie. Podałbym Ci pare kawałków kodu jeszcze, mógłbyś sobie skopiować kod klasy okna ale nie wiem czy poradziłbyś sobię, bo używam tam wielu klas (musiałbyś trochę podedukować). |
|
« 1 » 2 3 |