Speicherleck / AutoIT Hardcrash bei laden von binären Bilddateien

  • Hallo zusammen,

    ich erstelle dieses Thema neu da der Basis-Thread leider geschlossen ist. Leider habe ich bei der Funktion "Load_BMP_From_Mem" immer noch ein Speicherleck, bzw. ein Hardcrash der AutoIT.exe. Hat jemand (vll @UEZ wenn du das liest) eine Idee woran das liegen könnte? Ich such mir hier schon einen Wolf :(

    Eingesetzte AutoIT Version 3.3.14.2 / 3.3.15.0
    Fehler:

    Code
    !>14:51:13 AutoIt3.exe ended.rc:-1073741819
    +>14:51:13 AutoIt3Wrapper Finished.
    >Exit code: 3221225477


    Anbei ein Beispiel-Script (Der Fehler tritt alle 3-10 Minuten auf)

  • "Load_BMP_From_Mem" ist seit längerem als "_GDIPlus_BitmapCreateFromMemory" integriert. Probiere es mal damit.

    Abgesehen davon bewirkt TimerDiff($timer) > 1 immer, dass dein Skript 100% auf einem Core CPU Last erzeugt, aber ein Memory Leak kann ich nicht mit _GDIPlus_BitmapCreateFromMemory sehen.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Vielen Dank für deine schnelle Antwort! :)

    Danke für deinen Tipp, da macht es durchaus Sinn sich detailliert das Changelog anzuschauen.
    Kurz noch zu der Timer-Sache, die hab ich extra auf 1 gesetzt damit man den Fehler schnellstmöglich provozieren kann. Der steht sonst auf 500ms und der Fehler kommt dann immer nach ca. einer Stunde.

    "_GDIPlus_BitmapCreateFromMemory" klappt auf jeden Fall schon einmal. Was aber nicht klappt ist die Speicherfreigabe mit BitmapDispose oder ImageDispose. Hier bekomme ich direkt einen Crash. Muss ich noch deklarieren was für ein Format der binäre String hat? Oder mein Control als Grafik deklarieren?

    Hier mal auf die schnelle das Skript mit BitmapCreateFromMemory (Speicherfreigabe auskommentiert)


  • Hi,

    Folgende Zeile scheint das Problem zu veruhrsachen:

    AutoIt
    _WinAPI_DeleteObject(GUICtrlSendMsg($DemoPicture[$i -1], 0x0172, 0, $Bmp_Logo))

    Der Rückgabewert von GUICtrlSendMsg ist kein Handle, daher wird das voherige Bild nicht gelöscht.


    @Edit2: Folgedes sollte klappen:

    AutoIt
    _WinAPI_DeleteObject( Ptr(GUICtrlSendMsg($DemoPicture[$i -1], 0x0172, 0, $Bmp_Logo)))


    mfg
    Zeitriss

    2 Mal editiert, zuletzt von Zeitriss (5. September 2016 um 19:49)

    • In einer Schleife _GDIPlus_Startup() / _GDIPlus_Shutdown() macht keinen Sinn!
    • $Bmp_Logo = _GDIPlus_BitmapCreateFromMemory(Binary($pic), True) liefert dir ein GDI Bitmap Handle zurück, was inkompatible zu GDI+ Bitmap Handles ist!
    • GUICtrlSendMsg($DemoPicture[$i -1], 0x0172, 0, $Bmp_Logo) gibt dir wiederum ein GDI Bitmap Handle zurück, das mit _WinAPI_DeleteObject freigegeben werden muss
    • Anstelle von _GDIPlus_BitmapDispose($Bmp_Logo) musst du _WinAPI_DeleteObject($Bmp_Logo) nehmen, um den Memory Leak zu unterbinden, ansonsten CRASH

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯