Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[CPP] [WinAPI] Dziwny przebieg działania programu

Ostatnio zmodyfikowano 2015-05-17 21:42
Autor Wiadomość
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:
C/C++
#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;
   
   
    // Initialize the message structure
    ZeroMemory( & msg, sizeof( MSG ) );
   
    // Loop until there is a quit message from the window or the user
    done = false;
    while( !done )
    {
        // Handle the windows messages
        if( PeekMessage( & msg, NULL, 0, 0, PM_REMOVE ) )
        {
            TranslateMessage( & msg );
            DispatchMessage( & msg );
        }
       
        // If windows signals to end the application then exit out
        if( msg.message == WM_QUIT )
        {
            done = true;
        }
        else
        if( msg.message == WM_KEYDOWN )
        {
            if( hc->isKeyDown( VK_ESCAPE ) )
            {
                done = true;
            }
        }
        else
        {
            // Otherwise do the frame processing
            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
            //TUTAJ SĄ RZECZY DO TRYBU 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!
P-129402
pekfos
» 2015-03-29 12:55:01
To cały twój kod?
P-129409
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ć?
P-129510
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.
P-129511
TheReclif
Temat założony przez niniejszego użytkownika
» 2015-03-30 19:11:14
P-129577
Monika90
» 2015-03-30 19:30:23
C/C++
lpstr convertToLpstr( string target )
{
    lpcstr temp = target.c_str();
    lpstr result = const_cast < lpstr >( temp );
    return result;
}
koszmar
P-129580
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.
P-129591
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:
C/C++
LRESULT CALLBACK AbstractWindow::DefaultProcedure( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    AbstractWindow * pWnd = nullptr;
   
    // If window has just been created
    if( uMsg == WM_NCCREATE )
    {
        SetWindowLong( hwnd, GWLP_USERDATA,( long )(( LPCREATESTRUCT( lParam ) )->lpCreateParams ) );
    }
   
    // Get pointer of a window
    pWnd = GetObjectFromWindow( hwnd );
   
    // If pointer found call its procedure
    if( pWnd != nullptr )
    {
        return pWnd->defaultProcedure( hwnd, uMsg, wParam, lParam );
    }
    // Else call DefWindowProc (WinAPI)
    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ć przydatny

Na 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ć).
P-129592
« 1 » 2 3
  Strona 1 z 3 Następna strona