Gdi + Speicherprobleme?

  • Hallo Autoit Freunde,

    ich experimentiere gerade etwas mit gdi und da ist mir etwas aufgefallen. Wenn ich einen Screenshoot mache (per "drucken" taste) und einen Ausschnitt per _GDIPlus_GraphicsDrawImageRectRect in eine gui zeichne dann funktioniert das genau 394 mal. Ab dem 395. mal läuft die For/Next Schleife weiter aber der Ausschnitt wird nicht mehr in die GUI gezeichnet. Schliesse ich das Programm und starte es neu geht es wieder bis zum 394. mal. Für mich als Leihen sieht das so aus als ob der Speicher voll ist. Hat jemand eine Ahnung woran das liegen könnte? ?( ?( ?(

    Evtl. ist noch wichtig zu erwähnen, dass ich alles in eine Virtuellen Machiene programmiere um mein Host System sauber zu halten.

    Einmal editiert, zuletzt von smartpart82 (8. Mai 2013 um 22:20)

  • Gibst du alle Ressourcen von GDI+ wieder frei?

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Ich bin mir ehrlich gesagt nicht ganz sicher, ist für mich neoch Neuland. Ich poste mal die gdi func dann ist es einfacher ;)


    [autoit]


    func _screen_Fenster ($source_x,$source_y,$source_l,$source_h)

    [/autoit][autoit][/autoit][autoit]

    $source_l=$source_l-$source_x
    $source_h=$source_h-$source_y
    Send("{PRINTSCREEN}")
    sleep(100)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    _ClipBoard_Open(0)
    $BILDinZWSPEICHER = _ClipBoard_GetDataEx($CF_BITMAP)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    _GDIPlus_Startup()
    $bild = _GDIPlus_BitmapCreateFromHBITMAP($BILDinZWSPEICHER)

    [/autoit][autoit][/autoit][autoit]

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($XO_FORM)

    [/autoit][autoit][/autoit][autoit]

    local $pic_out_x=12
    local $pic_out_y=12;
    local $pic_out_l=184
    local $pic_out_h=47

    [/autoit][autoit][/autoit][autoit]

    _GDIPlus_GraphicsDrawImageRectRect($hGraphic, $bild, $source_x, $source_y,$source_l,$source_h,$pic_out_x,$pic_out_y,$pic_out_l,$pic_out_h)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    _ClipBoard_Close()
    _WinAPI_DeleteObject($bild)
    _GDIPlus_ImageDispose($hGraphic)

    [/autoit][autoit][/autoit][autoit]

    _GDIPlus_Shutdown()

    [/autoit][autoit][/autoit][autoit]

    return 0
    endfunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit]
  • 8o 8o 8o Vielen vielen Dank an euch beide für die schnelle Hilfe. Es war _WinAPI an dem es hing.

    sollte nochmal jemand das selbe Problem haben in meinem Script oben einfach => _WinAPI_DeleteObject($bild) durch _GDIPlus_BitmapDispose($bild) ersetzen und es läuft!

  • @chess:
    _GDIplus_StartUp() und _GDIPlus_Shutdown() kann man gefahrenlos auch mehrmals verwenden. Es ist also auch sowas hier möglich:

    [autoit]

    For $i = 1 To 100
    _GDIPlus_StartUp()
    Next

    [/autoit][autoit][/autoit][autoit]

    For $i = 1 To 100
    _GDIPlus_Shutdown()
    Next

    [/autoit]

    Tatsächlich wird GDI+ nur ein einzigstes mal gestartet, denn intern achtet die Funktion schon selber wie oft sie aufgerufen bzw. Beendet wurde. GDI+ startet sich nur beim ersten Aufruf von selber und beendet sich tatsächlich erst wieder, wenn die gleiche Anzahl an Shutdowns vorhanden ist.