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

Program się po pewnym czasie wysypuje.

Ostatnio zmodyfikowano 2011-12-10 11:24
Autor Wiadomość
piotreczek5
Temat założony przez niniejszego użytkownika
Program się po pewnym czasie wysypuje.
» 2011-12-06 20:47:18
C/C++
switch( msg )

{
   
case WM_LBUTTONDOWN:
   
    wcisniety = true;
   
    mX1 = GET_X_LPARAM( lPar ) - rysunek[ nad_ID ].x;
    mY1 = GET_Y_LPARAM( lPar ) - rysunek[ nad_ID ].y;
   
   
    break;
   
case WM_MOUSEMOVE:
   
    //GetScrollInfo( panel_srodkowy, SB_VERT, & si );
   
    if( wcisniety != true )
    for( int i = 0; i < liczba_blokow; i++ )
   
    if( GET_X_LPARAM( lPar ) > rysunek[ i ].x && GET_X_LPARAM( lPar ) < rysunek[ i ].x + 100 && GET_Y_LPARAM( lPar ) > rysunek[ i ].y - si.nPos + 10 && GET_Y_LPARAM( lPar ) < rysunek[ i ].y + 100 - si.nPos - 10 ) { nad = true; nad_ID = i; break; } else nad = false;
   
    if( nad == true ) {
        HRGN obrys;
        HDC hdc;
        hdc = GetDC( panel_srodkowy );
        HBRUSH kolorek = CreateSolidBrush( RGB( 0, 255, 0 ) );
        obrys = CreateRectRgn( rysunek[ nad_ID ].x, rysunek[ nad_ID ].y, rysunek[ nad_ID ].x + 100, rysunek[ nad_ID ].y + 100 - si.nPos );
        FrameRgn( hdc, obrys, kolorek, 5, 5 );
        DeleteObject( kolorek );
        DeleteObject( obrys );
        //ReleaseDC(panel_srodkowy,hdc);
       
    } else RedrawWindow( panel_srodkowy, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ERASENOW );
   
    if( nad == true && wcisniety == true ) porusza = true; else porusza = false;
   
   
    if( porusza ) {
        rysunek[ nad_ID ].x = GET_X_LPARAM( lPar ) - mX1;
        rysunek[ nad_ID ].y = GET_Y_LPARAM( lPar ) - mY1;
        RedrawWindow( panel_srodkowy, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ERASENOW );
        //InvalidateRect(panel_srodkowy,NULL,1);
       
       
       
       
       
    }
   
    break;
   
case WM_LBUTTONUP:
    wcisniety = false;
    xob = GET_X_LPARAM( lPar ) - mX1;
    yob = GET_Y_LPARAM( lPar ) - mY1 + 100;
   
   
    break;
   
case WM_PAINT:
    HBITMAP obraz;
    PAINTSTRUCT ps;
    HDC hdc, memDC;
    HPEN pioro;
    pioro = CreatePen( PS_SOLID, 4, 0x000000 );
    POINT pkt;
   
   
   
   
    hdc = BeginPaint( panel_srodkowy, & ps );
    memDC = CreateCompatibleDC( hdc );
    obraz = NULL;
    for( int i = 0; i < liczba_blokow; i++ ) {
        switch( rysunek[ i ].typ ) {
        case WARUNKOWY: obraz =( HBITMAP ) LoadImage( NULL, "warunkowy.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); break;
        case WEWY: obraz =( HBITMAP ) LoadImage( NULL, "wewy.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); break;
        case OPERACYJNY: obraz =( HBITMAP ) LoadImage( NULL, "operacyjny.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); break;
        case START: obraz =( HBITMAP ) LoadImage( NULL, "start.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); break;
        case STOP: obraz =( HBITMAP ) LoadImage( NULL, "stop.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); break;
        }
        SelectObject( memDC, obraz );
        BitBlt( hdc, rysunek[ i ].x, rysunek[ i ].y - si.nPos, 100, 100, memDC, 0, 0, SRCCOPY );
       
       
    }
   
   
    EndPaint( panel_srodkowy, & ps );
    if( liczba_blokow > 0 ) for( int i = 1; i < liczba_blokow; i++ ) {
       
        hdc = GetDC( panel_srodkowy );
        SelectObject( hdc, pioro );
       
        MoveToEx( hdc, rysunek[ i - 1 ].x + 50, rysunek[ i - 1 ].y + 100, & pkt );
        LineTo( hdc, rysunek[ i ].x + 50, rysunek[ i ].y );
        DeleteObject( pioro );
        //ReleaseDC(panel_srodkowy,hdc);
       
    }
    ps.fErase = true;
    DeleteDC( memDC );
   
    DeleteObject( obraz );
   
   
   
    ReleaseDC( panel_srodkowy, hdc );
    DeleteDC( hdc );
    break;
   
   
    //jeżeli został naciśnięty przycisk o identyfikatorze numer 1 wyświetli się komunikat
   
    break;
case WM_CLOSE:
   
    PostQuitMessage( 0 );
    break;
case WM_NCACTIVATE:
    return DefWindowProc( hwnd, msg, TRUE, lPar );
    default:
    return DefWindowProc( hwnd, msg, wPar, lPar );
}
return 0;
}

Program ma za zadanie przenosić obiektu z jednego miejsca na ekranie na drugi.
Przedstawiłem kawałek kodu mojego programu. Przy poruszaniu myszką zwiększa się zapotrzebowanie na pamięć (menedżer procesów) . Przy przenoszeniu tychże obiektów również.

Dochodzi do pewnego momentu jakieś 2 minuty działania programu program zaczyna szaleć. Niepoprawnie odrysowuje nawet przyciski, które znajdują się pod kontrolą innego potoku wiadomości. Nawet pulpit szaleje.

Tak jakby system nie wiedział jak obsłużyć komunikat WM_PAINT. Próbowałem na wszelakie sposoby. Różne typy zwalniania pamięci i nadal nie wiem. Proszę o pomoc.
P-45241
DejaVu
» 2011-12-07 09:05:09
Sprawdź czy zużycie pamięci przypadkiem stale nie rośnie w menedżerze zadań. Jeżeli rośnie to znaczy, że czegoś nie zwalniasz.
P-45254
piotreczek5
Temat założony przez niniejszego użytkownika
» 2011-12-07 15:58:52
Jeśli nie ruszam myszą nie wzrasta w ogóle. Jeśli ruszam zaczyna wzrastać raczej bez spadku.
P-45263
DejaVu
» 2011-12-07 22:38:58
No to nie zwalniasz jakiegoś zasobu :) Przy ruchu myszką przychodzą różne komunikaty do kolejki komunikatów, więc gdzieś masz po prostu wyciek pamięci.
P-45297
piotreczek5
Temat założony przez niniejszego użytkownika
» 2011-12-08 17:18:34
To wiem :) Ale nie mam pojęcia gdzie toteż dałem kodzik.
P-45334
szyx_yankez
» 2011-12-08 18:04:50
Forum to nie debugger. Naucz się z tego przydatnego narzędzia korzystać.
P-45335
piotreczek5
Temat założony przez niniejszego użytkownika
» 2011-12-08 21:03:56
Niestety nie mam czasu na okiełznanie tego przydatnego narzędzia. Jest dla mnie trochę nie zrozumiałe i nie znalazłem w Internecie jakiegoś poradnika. Nie mam czasu, a termin goni wściekle...
P-45355
xevuel
» 2011-12-10 08:30:39
Debuger w C::B jest bardzo fajny i mimo że czasem daje niezrozumiałe komunikaty, to ogólnie jest bardzo intuicyjny.
Jak na moje oko, to błąd leży tu:
C/C++
//ReleaseDC(panel_srodkowy,hdc);
, bo nie zwalniasz tego hdc. Jeśli jednak to nie to, to skomentuj część programu używającą GDI (nawet jeśli przez to program nie będzie chwilowo działał jak powinien) i zobacz, czy po skomentowaniu dalej wycieka pamięć. Jeśli nie, to błąd będzie leżał we właśnie skomentowanym kodzie.
P-45388
« 1 » 2
  Strona 1 z 2 Następna strona