Variablen schließen nicht? - Seht ihr einen Fehler?

  • Hallo zusammen,


    es klingt vielleicht doof, aber könnte mir mal bitte jemand von euch sagen, ob in dem folgenden Script Fehler sind im Sinne von: Ich deklariere eine Variable oder so, und gebe sie nicht frei?
    Ihr würdet mir echt sehr helfen. Danke im Vorraus.


    Grüße Yaerox


    Grüne Hölle

    2 Mal editiert, zuletzt von Yaerox ()

  • Ouhh mist, die ist abhanden gekommen ^^


    Problem: Ich starte das Dingen, es läuft durch. Hier wird quasi simuliert, dass Batch-Dateien abgearbeitet werden. Simulation -> daher auch die primitive immer gleiche feste Zuweisung in der Funktion lade_aktive_aps.


    Man schaue sich das Spiel im Taskmanager an. Bei mir lag der Arbeitspeicher nach dem start bei ~ 11.600K ... Nach ca. 16 Stunden war er bei ~11.750K. Dies heisst dass entweder eine der genutzen Funktionen von AutoIt nicht den gesamten Speicher freigibt, oder ich irgendwo eine Variable o.ä. jedesmal öffne und nicht schließe.


    Meine Tests: Je 100x und 300x eine Batch Datei starten: Run, Run @ComSpec, RunWait, RunWait @ComSpec, ShellExecute, ShellExecute CMD, ShellExecuteWait, ShellExecuteWait CMD ... Ergebis. Bis auf Run und RunWait sind alle Scripts im Speicher gestiegen. Daher nutze ich hier Run.
    Dann habe ich ein Testscript geschrieben, dass Einfach nur in eine Datei ('log') etwas schreibt. 2 Tests gemacht mit 100.000 Einträgen, speicher steigt nicht.


    Somit bin ich der Meinung wenn das oben gespoilerte Script im Speicher noch steigt, müsste wenn es mein Verschulden ist ja noch ein Fehler bei den deklarationen oder so vorhanden sein, sonst ergibt das ja keinen Sinn.


    Grüße

  • Hilft dir das:


    Func _ReduceMemory($i_PID = -1)
    If $i_PID <> -1 Then
    Local $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $i_PID)
    Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', $ai_Handle[0])
    DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $ai_Handle[0])
    Else
    Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', -1)
    EndIf
    Return $ai_Return[0]
    EndFunc ;==>_ReduceMemory


    von hier vielleicht?


    Der Fehler steckt möglicherweise auch im Code von AutoIt. Die C++-Anweisungen allozieren ja letztlich den Speicher und geben ihn halt nicht automatisch frei. Wenn da eine Stelle vergessen worden sein sollte, dann kannst du dagegen nicht ankommen. Außer vielleicht mit dem Stück Code von oben :).

  • Bei der Nutzung von Garbage Collectoren ist bei mir bisher immer dann der zugesicherte Speicher in die Luft geschossen.


    Aber ich meine auch wenn es nur ein wenig ist, er sollte doch nicht steigen? Und das wiederum müsste bedeuten ich müsste irgendwo einen Fehler haben, oder es liegt an AutoIt. Das ist ja auch wieso ich euch beten wollte da mal drüber zu gucken ^^
    Das deprimierende ist, es sind mittlerweile rel. viele Befehle in AutoIt die in meinen Augen Speicherfehler hervorrufen. Habe schon zig Testscripts geschrieben und jedesmal das gleiche :/

  • Bei den letzten 4 Scripts die aufgebaut waren wie: GUI + Control + eine Schleife die 40.000 Items zu einem Control hinzufügt, und dann löscht) kam die Antwort: Ich kann keinen Fehler sehen ...


    Dann haben noch zwei andere das Problem erklärt dann kam nie wieder eine Antwort :/

  • aber könnte mir mal bitte jemand von euch sagen, ob in dem folgenden Script Fehler sind im Sinne von: Ich deklariere eine Variable oder so, und gebe sie nicht frei?

    Das Gegenteil ist der Fall du benutzt Variablen Arrayelemente die es nicht gibt:

    Code
    Running AU3Check (1.54.19.0) from:D:\Programme\AutoIt3
    +>13:59:46 AU3Check ended.rc:0
    >Running:(3.3.6.1):D:\Programme\AutoIt3\autoit3.exe "D:\Programme\AutoIt3\Test\asdfb.au3"
    D:\Programme\AutoIt3\Test\asdfb.au3 (58) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    $a_row0 = StringSplit($a_row0[2], ":")
    $a_row0 = StringSplit(^ ERROR
    ->13:59:50 AutoIT3.exe ended.rc:1
    +>13:59:51 AutoIt3Wrapper Finished
    >Exit code: 1 Time: 7.338


    Skript mit F5 gestartet und Startbutton geklickt.


    Der Seicherzuwachs könnte auch in den Dosdateien begründet sein, ersetze einmal Run mit RunWait und teste dein Skript damit.


    Edit: Ich habe jetzt dein Skript eine Weile laufen lassen (Ative App laden, danach Start). Während dein Skript nach dem Starten sich nur beim Wechel von 1stellig auf 2stellig 3stellig etwas RAM genehmigt steigt der Ramverbrauch meines Virenscanners stetig. Bei Stop stagniert er aber beim Fortsetzen geht das ständige Erhöhen des RAMs weiter. Ich kann deine Schlussfolgerung das AutoIt ein grösseres Speicherleck hat nicht nachvollziehen.


    mfg autoBert


    mfg autoBert

  • Wie du vll. selbst gesehen hast das mit dem Array lag daran dass man erst laden klicken muss, hab ich vergessen zu erwähnen. Sorry.


    Bei mir war es bisher mit dem von 1stellig auf 2stellig nicht nur, auch zwischendurch .... hmmm :/


    Was heisst meine Schlussfolgerung ... ich war oder bin der Meinung wenn jetzt kein Fehler mehr in dem Code ist muss ja AutoIt einen haben, da es ja nicht normal ist das ein programm im Speicher ununterbrochen wächst ;)


    Ich habe noch einen heißen Tipp aus dem englischen Forum bekommen ... AdlibRegister ... ich habe ein Sleep(1000) und Adlib ist bei 1000, d.h. ich habe wohlmöglich alles was noch offen war an Variablen etc. nochmal geöffnet oder sowas ... habe den Fehler behoben und beobachte grad das Script ... bisher sieht es gut aus, es läuft aber auch erst seit ~ 3 Stunden ... abwarten und mal hoffen dass dort der Fehler war...


    Grüße

  • Nachdem ich nun mein Script langsam wieder zusammenflicken wollte, taucht auf einmal ein altes Problem auf o.O Der Speicher wächst ca. 100-200K pro durchlauf. Damals war es weil ich kein SQL Query Finalize hatte, jetzt bin ich langsam überfragt.


    Mein Testscript, mit dem ich den Fehler nach der Info aus dem englischen Forum behoben habe, lief 3 Tage am Stück ohne zu steigen und sich aufzuhängen:


    Und hier meine aktuelle bei der ich lediglich nun SQL hinzugefügt habe (kann euch das leider auf die Schnelle net lauffähig machen, das würde etwas länger dauern, ich versuche das mal so fix wie möglich):


    Mein MemLog sagt (2 Durchläufe):


    Wie man sehen kann, wird an den SQL Stellen der Speicher erhöht. Das Array wird größer, würde ich noch verstehen ... aber wieso es dabei bleibt, verstehe ich nicht ... oder sieht zufällig jmd noch einen dicken SQL Fehler o.O?


    Grüße