[C/C++] Systemressourcen erschöpft wegen screenshots

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Pac_-_man, 12. April 2009 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 12. April 2009
    Systemressourcen erschöpft wegen screenshots

    Hi!

    Vorab: dieses projekt bearbeite ich mit dem C++Builder von Borland.

    Also ich hab folgendes problem: ich hab ein programm, welches in bestimmten intervallen (so alle 2-3 sekunden) einen screenshot macht, diesen dann aus der zwischenablage lädt und dann auswertet. ich habe eine Methode geschrieben, die einen screenshot von dem aktuellen Vordergrund-Window macht und dann in eine TBitmap (von Borland) lädt. für die Instanz der System-Zwischenablage gibt es das Borland-Objekt TClipboard.

    das Problem ist jetzt folgendes: das programm läuft eine Zeit lang und irgendwann kommt der Fehler (ist immer unterschiedlich wann der kommt): "Ressourcen erschöpft".

    Ich weiß ehrlich gesagt nicht warum dieser Fehler auftritt. Eigentlich wird doch bei jedem Screenshot den man macht der alte Speicher ueberschrieben(?). Ausserdem rufe ich nach jedem Screenshot die Methode Clear() auf, welche die Zwischenablage eigentlich leeren sollte.

    Hier ist die Funktion, die einen Screenshot macht: ("ClpBrd" ist im Folgenden ein Zeiger auf die Zwischenablage, geholt mit TClipboard())
    Code:
    void TForm1::Screenshot(TBitmap* Btmp)
    { 
     // Zwischenablage leeren!
     ClpBrd->Clear();
    
     // Fenster muss im Vordergrund sein!
     keybd_event( VK_MENU, 0, 0, 0 );
     keybd_event( VK_SNAPSHOT, 0, 0, 0 );
     keybd_event( VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0 );
     keybd_event( VK_MENU, 0, KEYEVENTF_KEYUP, 0 );
    
     // Bitmap zum Zwischenspeichern
     Btmp = new Graphics::TBitmap;
    
     // Screenshot in Bitmap laden
     if(ClpBrd->HasFormat(CF_BITMAP))
     {
     try
     {
     Btmp->LoadFromClipboardFormat(CF_BITMAP, ClpBrd->GetAsHandle(CF_BITMAP), 0);
     ClpBrd->Clear();
     }
     catch(...)
     {
     // Zwischenablage loeschen und neu versuchen
     ClpBrd->Clear();
     delete Btmp;
     GetScreenshot(Btmp);
     }
     }
     else
     {
     // Zwischenablage loeschen und neu versuchen
     ClpBrd->Clear();
     delete Btmp;
     Screenshot(Btmp);
     }
    }
    
    ist da irgendwo noch nen memory leak? Auch die Bitmap die als Parameter uebergeben wird, wird an einer anderen Stelle im Code noch 100%ig mit delete freigegeben.

    Ich weiß echt nicht mehr weiter und bin für jeden Hinweis und jeden Hilfe dankbar!

    // edit: auf meinem Laptop (der mehr RAM hat als mein Desktop Rechner) kommt der Fehler nicht so schnell wie auf dem Desktop Rechner. Also ist es auf jeden Fall ein Speicher-Problem.

    mfg
    pacman
     
  2. 14. April 2009
    AW: Systemressourcen erschöpft wegen screenshots

    die methode ist einfach schlecht. ka wo da jetzt der leak ist, aber normalerweise:

    hwnd vom desktopwindow besorgen (GetDesktopWindow) und dann per gdip auswerten.
     
  3. 14. April 2009
    AW: Systemressourcen erschöpft wegen screenshots

    hmm... naja, du sagst die ist schlecht, aber genauso hab ich das aus dem Muster-Beispiel von Borland übernommen (die rekursiven Aufrufe stammen allerdings von mir). deshalb würde ich sie jetzt nicht als "schlecht" bezeichnen.

    aber vlt könntest du deine Idee noch etwas ausführen. was ist denn gdip? wäre echt nett! danke schonmal!
     
  4. 14. April 2009
    AW: Systemressourcen erschöpft wegen screenshots

    nur weils auffer borland seite steht isses trotzdem grottig mit dem clipboard zu arbeiten.

    gdip = gdi+ (google)

    GDIPLUSSTARTUP
    GDIPCREATEBITMAPFROMSCAN0
    GDIPCREATEFROMHWND
    GDIPDRAWIMAGE
    GDIPDISPOSEIMAGE
    GDIPLUSSHUTDOWN

    wozu brauchst du eigentlich den screenshot?
     
  5. 14. April 2009
    AW: Systemressourcen erschöpft wegen screenshots

    danke nochmal... und ich wusste nicht dass das Borland-Clipboard() Objekt verbugged ist. denn es würde auch wunderbardamit funzen, wenn das Clipboard denn tatsächlich geleert werden würde.

    aber ich werd mal versuchen mit dem was du geschrieben hast was anzufangen^^

    wofür ichs brauche: naja, das programm soll später in der lage sein, andere Programme zu steuern. sowas wie ein windows bot wenn man so will^^ er soll viele kleine simpüle aufgaben übernehmen können wenn man mal afk ist oder so. aber für manches brauche ich halt infos, die der mensch zwar mit seinem Auge sehen kann, aber das Programm leider nicht ohne weiteres... deshalb dachte ich wenn man das ganze mit screenshots lösen würde, wäre das am besten...

    edit: sry, aber das hilft mir überhaupt nicht weiter. hab versucht gdi+ funktionen zu benutzen und es kommen nur fehler, dass die nicht definiert sind... gibts nicht irgendwie nen anderen weg um an die pixel vom desktop handle zu gelangen?? wenn nicht, könntest du dann vlt ein beispiel posten oder so?
    achja und hast du evtl auch nen vernünftigen link für das sdk? bei microsoft hab ich irgendnen müll gezogen. jedenfalls sind da keine header dateien oder libs enthalten.


    mfg
    pacman
     
  6. 15. April 2009
    AW: Systemressourcen erschöpft wegen screenshots

    gdi+ sollte bei borland intern und nicht als lib vorhanden sein:
    GDI+

    alternativ:
    GetDC
    CreateCompatibleDC
    CreateCompatibleBitmap
    BitBlt
    DeleteDC
    OleCreatePictureIndirect
    ReleaseDC

    aber spätestens ab OleCreatePictureIndirect wirds komplizierter.
     
  7. 17. April 2009
    AW: Systemressourcen erschöpft wegen screenshots

    hast recht. war bei borland drin. allerdings hat borland wieder rumgejammert als ich die gdiplus.h einbinden wolte um die oben von dir genannten funktionen nutzen zu können. hab dann noch nen bisschen rumprobiert und dann irgendwann die schnauze voll gehabt^^

    aber ich habs jetzt trtzdem so zum laufen bekommen wie ichs wollte zwar jetzt doch mit screenshots, aber alle 3-4 sekunden wird das wohl klar gehen (natürlich hast du damit recht das es grottig ist. über das desktop handle wäre es viel effizienter). naja, drauf geschissen. hab jetzt erstmal wieder die schnauze voll von borland. nächstes mal mache ich wieder alles komplett selbst. ist zwar mehr arbeit, aber wass solls, dafür läufts wenigstens.

    vielen dank für deine hilfe! bw ist raus!

    ~closed~
     
  8. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.