Memory-Leak verhindern

  • Hallo zusammen, ich habe ein GUI auf welchem ich zeichnen möchte folgendermaßen erstellt:

    Spoiler anzeigen
    [autoit]


    $hGUI = GUICreate("", $GuiWidth, $GuiHeight, Default, Default, BitOR(0x80000000, 0x08000000), BitOR(0x00080000, 0x00000008, 0x00000080))
    GUISetState(@SW_SHOW)

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

    $hDC_Window = _WinAPI_GetDC($hGUI)
    $hDC_Buffer = _WinAPI_CreateCompatibleDC($hDC_Window)
    $hBitmap_Buffer = _WinAPI_CreateCompatibleBitmap($hDC_Window, $GuiWidth, $GuiHeight)
    _WinAPI_SelectObject($hDC_Buffer, $hBitmap_Buffer)

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

    _GDIPlus_Startup()

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHDC($hDC_Buffer)

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

    _GDIPlus_GraphicsSetSmoothingMode($hGraphic, 2)

    [/autoit]

    Jetzt habe ich aber bemerkt, dass jedes mal wenn ich auf das Grafikobject $hGraphic zeichne, der Speicherverbrauch um ca. 150kB hoch geht. An sich nicht schlimm, aber da es durchaus vorkommen kann, dass ich mehrmals in der Sekunde neu zeichnen muss, kann sich das doch ganz schön summieren und nach der Zeit so viel Speicher verbrauchen dass nichts mehr funktioniert. Meine Frage ist jetzt an euch, welches Object ich neu erstellen muss, damit die nicht mehr genutzen Daten frei gegeben werden?

    Das Freigeben und wieder erstellen des Grafikobjects per:

    [autoit]


    _GDIPlus_GraphicsDispose($hGraphic)
    $hGraphic = _GDIPlus_GraphicsCreateFromHDC($hDC_Buffer)

    [/autoit]

    Bringt leider nicht den gewünschten Erfolg. Jemand eine Idee?
    Grüße ErrorKid

    Einmal editiert, zuletzt von ErrorKid (23. Februar 2013 um 19:08)

  • Klar!

    [autoit]


    _GDIPlus_GraphicsClear()
    _GDIPlus_BrushCreateSolid()
    _GDIPlus_GraphicsFillEllipse()
    _GDIPlus_BrushDispose()
    _GDIPlus_PenCreate()
    _GDIPlus_GraphicsDrawArc()
    _GDIPlus_PenDispose()
    For 1 To 10
    _GDIPlus_PenCreate()
    _GDIPlus_GraphicsDrawArc()
    _GDIPlus_PenDispose()
    Next
    _GDIPlus_ImageLoadFromFile()
    _GDIPlus_ImageGetHeight()
    _GDIPlus_ImageGetWidth()
    _GDIPlus_ImageLoadFromFile()
    _GDIPlus_ImageGetHeight()
    _GDIPlus_ImageGetWidth()
    _GDIPlus_GraphicsDrawImageRectRect()
    _GDIPlus_GraphicsDrawImageRectRect()

    [/autoit]

    Das ganze ist nur Schematisch dargestellt. Alles was dazwischen kommt sind eigentlich nur Berechnungen, also eigentlich unrelevant. Die Variablen für die Berechnungen werden immer wieder verwendet, also eigentlich auch kein Grund für den ständigen Speicherhunger.

  • [autoit]

    _GDIPlus_ImageLoadFromFile()

    [/autoit]

    Hast du da vielleicht das

    [autoit]

    _GDIPlus_ImageDispose

    [/autoit]

    vergessen?

    Überhaupt sollten auch

    [autoit]

    _GDIPlus_BrushCreateSolid()

    [/autoit]


    und

    [autoit]

    _GDIPlus_PenCreate()

    [/autoit]

    nicht in schleifen aufgerufen werden, erstell sie doch bitte einmal am Anfang und gebe sie wieder frei wenn dein Script beendet wird.

  • Tatsächlich,

    [autoit]

    _GDIPlus_ImageDispose()

    [/autoit]

    war der Auslöser für den hohen Speicherhunger.
    Danke für deine Hilfe :)

    Grüße ErrorKid