piotreczek5 Temat założony przez niniejszego użytkownika |
Program się po pewnym czasie wysypuje. » 2011-12-06 20:47:18 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: 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 ); } 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 ); } 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 ); } ps.fErase = true; DeleteDC( memDC ); DeleteObject( obraz ); ReleaseDC( panel_srodkowy, hdc ); DeleteDC( hdc ); break; 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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
szyx_yankez |
» 2011-12-08 18:04:50 Forum to nie debugger. Naucz się z tego przydatnego narzędzia korzystać. |
|
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... |
|
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: , 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. |
|
« 1 » 2 |