Animation stoppt nach 10 sek von alleine



  • Hi,
    ich habe folgenden Timer:
    SetTimer(hWnd,ID_FOO,render_delay,NULL);

    In der ID_FOO Nachricht lasse ich eine Animation zeichnen. Diese kann man mit einem Druck auf einen Button pausieren und wieder aufnehmen.
    Das funktioniert auch alles wunderbar, bis nach ca. 10Sek. die Animation nicht mehr auf den Bildschirm gezeichnet wird, sondern der entsprechende Bereich im Fenster einfach weiss bleibt, anstatt sich mit der Anmation zu füllen. Die Timer Nachricht wird weiterhin ausgeführt.
    Es scheint, als würde irgendetwas nach einer gewissen Zeit seine Gültigkeit verlieren (Backbuffer DC??), wodurch die Zeichenfunktionen zwar ausgeführt werden, jedoch nicht mehr auf den Fensterzeichenbereich kopiert werden können...



  • Hab das jetzt mal bisschen eingegrenzt und es scheint so, als würde der backbuffer nach ca. 10 sek. einfach nicht mehr voll geschrieben, bzw. nicht mehr richtig auf den Screen-DC kopiert...

    Im Moment sieht die Malfunktion, die über den Timer alle 20ms aufgerufen wird so aus:

    ID_FOO:
    
    hdc=GetDC(hWnd);							
    backbuffer=CreateCompatibleDC(hdc);		
    		SelectObject(backbuffer,CreateCompatibleBitmap(backbuffer,WNDWIDTH,WNDHEIGHT));		
    
    FillRect(backbuffer,drawrec,CreateSolidBrush(RGB(255,255,255))); //weiss übermalen
    
    //Fortlaufende Sinuskurve berechnen und mit MoveToEx und LineTo malen
    
    BitBlt(hdc,deleterc->left,deleterc->top,deleterc->right,deleterc->bottom,backbuffer,deleterc->left,deleterc->top,SRCCOPY);	
    InvalidateRect(hWnd,drawrec,FALSE);		
    break;
    

    Was kann da nach 10sek. nicht mehr funktionieren?? Ich weiß wirklich nicht mehr weiter...



  • Oh man das ist doch so offensichtlich => Du gibst die GDI Sachen gar nicht frei



  • Hab jetzt

    ReleaseDC(hWnd,backbuffer);
    ReleaseDC(hWnd,hdc);
    

    Hintendran gepackt, ändert aber nichts... 😞



  • und leute wie du kriegen ein studium bei ibm? traurig traurig



  • ach verdammt - ich steh halt einfach nur noch aufm schlauch und dazu kommt noch dass ich schon ewig nix mehr mit der WinAPI gemacht hab 8[ afk petzold rauskramen XD

    EDIT: So müsste doch alles freigegeben sein, Problem besteht jedoch weiterhin...

    hdc=GetDC(hWnd);
    backbuffer=CreateCompatibleDC(hdc);		
    
    SelectObject(backbuffer,CreateCompatibleBitmap(backbuffer,WNDWIDTH,WNDHEIGHT));
    
    FillRect(backbuffer,drawrec,CreateSolidBrush(RGB(255,255,255)));
    
    //zeichnen
    
    BitBlt(hdc,deleterc->left,deleterc->top,deleterc->right,deleterc->bottom,backbuffer,deleterc->left,deleterc->top,SRCCOPY);	
    
    InvalidateRect(hWnd,drawrec,FALSE);	
    
    DeleteObject(GetCurrentObject(backbuffer,OBJ_BITMAP));
    ReleaseDC(hWnd,backbuffer);
    ReleaseDC(hWnd,hdc);
    


  • kannste mal im taskmanager schauen ob die handles immer zunehmen wenn dein proggie läuft, da weisste ob du alles richtig freigegeben hast



  • also die speicherauslastung nimmt immer weiter zu.. Aber ist Freigabe wirklich ein Grund, dass es einfach aufhört neu zu zeichnen?? Ich mein die Zeichenfunktionen und Blt und alles werden immer noch ausgeführt nur es wird scheinbar ein weisses Bild (backbuffer) auf den Bildschirm kopiert, ich verstehe nicht warum, bzw. wie sowas überhaupt sein kann oder durch was es verursacht werden könnte...

    EDIT: Sehr interessant, hab das Programm jetzt während des Antwort schreibens laufen gelassen und jetzt tabb ich wieder rein und zack wird oben der Fensterkopf sowie eine Scrollbar im Fenster nicht mehr richtig angezeigt. An der Scrollbar sind Zahlen statt Pfeile und der Fenstertitel oben ist durchsichtig. Da muss irgendwas grundlegend schief laufen 😕



  • ja das liegt wie schon gesagt daran, daß du die GDI sachen ned korrekt freigibst. da ist klar daß dann sowas bei rauskommt.



  • MasterCounter wo gibst du den "solid brush" frei?



  • hab ich jetzt freigegeben ändert aber nix... hab jetzt folgenden abgeänderten code:

    case ID_TIMER:
    				{					
    				HBRUSH hClear;
    				HBITMAP hBmp;
    
    				hdc=GetDC(hWnd);
    				backbuffer=CreateCompatibleDC(hdc);		
    
    				hBmp=CreateCompatibleBitmap(backbuffer,WNDWIDTH,WNDHEIGHT);
    				hClear=CreateSolidBrush(RGB(255,255,255));
    
    				SelectObject(backbuffer,hBmp);				
    				FillRect(backbuffer,drawrec,hClear);
    
    				DrawCoordSys(backbuffer,verschiebung);	
    
    				MoveToEx(backbuffer,...,NULL);				
    					LineTo(backbuffer,...);
    
     				BitBlt(hdc,deleterc->left,deleterc->top,deleterc->right,deleterc->bottom,backbuffer,deleterc->left,deleterc->top,SRCCOPY);	
    
    				DeleteObject(hBmp);
    				DeleteObject(hClear);
    				ReleaseDC(hWnd,backbuffer);
    				ReleaseDC(hWnd,hdc);
    				break;
    				}
    

    Nur jetzt hab ich das Problem, dass der Buffer nicht auf das FillRect reagiert, egal welchen Wert ich einstelle das Fenster wird nun komplett mit schwarz übermalt... Irgendwas veraff ich hier grade richtig Freunde der Nacht -.-



  • @MasterCounter
    Die Funktionen ineinander zu verschachteln, bringt dir hier wie schon erwähnt Speicherprobleme.
    1. Löschen des Brush-Objekts fehlt
    2. Ein Create(Compatible)DC erfordert ein DeleteDC und kein ReleaseDC

    HBITMAP hbmp, hbmpold;
    HDC hdc, backbuffer;
    HBRUSH hbrush;
    
    hdc=GetDC(hWnd);
    backbuffer=CreateCompatibleDC(hdc);
    hbmp = CreateCompatibleBitmap(backbuffer, WNDWIDTH, WNDHEIGHT);
    hbmpold = (HBITMAP)SelectObject(backbuffer, hbmp);
    hbrush = CreateSolidBrush(RGB(255, 255, 255));
    
    FillRect(backbuffer, drawrec, hbrush);
    
    //zeichnen
    
    BitBlt(hdc,deleterc->left,deleterc->top,deleterc->right,deleterc->bottom,backbuffer,deleterc->left,deleterc->top,SRCCOPY);
    
    // Freigabe der Objekte
    DeleteObject(hbrush);
    SelectObject(backbuffer, hbmpold);
    DeleteObject(hbmp);
    DeleteDC(backbuffer);
    ReleaseDC(hWnd, hdc);
    
    InvalidateRect(hWnd,drawrec,FALSE);
    


  • läuft 🤡 Ich krieg die krise... Tausend Dank an dich! 👍 Aber ein Gutes hat die Sache ja, ich vergess die Sache mit Release usw. nie nie mehr 😃



  • erledigt


Anmelden zum Antworten