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.

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Add_Constants=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>

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

    Opt("GUIOnEventMode", 1)
    Opt("MustDeclareVars", 1)
    OnAutoItExitRegister("_exit")

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

    Global $aLVERSATZ_bot[1][3]
    Global $aLVERSATZ_top[5][2]
    Global $ablaufstatus

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

    ;#GUI 1
    Global $aufgabenlistefenster = GUICreate("Aufgabenliste", 250, 390)

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

    Global $zaehler_label = 0
    Global $hzaehler_label = GUICtrlCreateLabel("0", 50, 72, 200, 20)
    Global $aladeaktiveap_button = GUICtrlCreateButton("Lade aktive AP", 140, 40, 100, 30)
    Global $astart_button = GUICtrlCreateButton("Start", 30, 5, 50, 30)
    Global $astop_button = GUICtrlCreateButton("Stop", 30, 40, 50, 30)

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

    GUISetState(@SW_SHOW, $aufgabenlistefenster)

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

    ;Aufgabenliste
    GUICtrlSetOnEvent($aladeaktiveap_button, "lade_aktive_aps")
    GUICtrlSetOnEvent($astart_button, "pruefe_ablauf")
    GUICtrlSetOnEvent($astop_button, "beende_ablauf")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit", $aufgabenlistefenster)

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

    While 1
    Sleep(100)
    WEnd

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

    Func lade_aktive_aps()
    $aLVERSATZ_bot[0][0] = "0"
    $aLVERSATZ_bot[0][1] = "18/01/2013 08:00:00"
    $aLVERSATZ_bot[0][2] = "Test AP"
    EndFunc ;==>lade_aktive_aps

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

    Func pruefe_ablauf()
    $ablaufstatus = True
    AdlibRegister("vergleiche_zeitstempel", 1000)
    EndFunc ;==>pruefe_ablauf

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

    Func vergleiche_zeitstempel()
    Local $a_row0, $naechste_geplante_startdatum, $aDatumForm
    If UBound($aLVERSATZ_bot) = 0 Then
    beende_ablauf()
    Return 0
    EndIf
    $a_row0 = StringSplit($aLVERSATZ_bot[0][1], " ")
    $naechste_geplante_startdatum = $a_row0[1]
    $a_row0 = StringSplit($a_row0[2], ":")

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

    $aDatumForm = StringSplit($naechste_geplante_startdatum, "/")

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

    If $aDatumForm[3] * 365 + $aDatumForm[2] * 30 + $aDatumForm[1] = @YEAR * 365 + @MON * 30 + @MDAY Then
    If $a_row0[1] * 3600 + $a_row0[2] * 60 = @HOUR * 3600 + @MIN * 60 + @SEC Or $a_row0[1] * 3600 + $a_row0[2] * 60 < @HOUR * 3600 + @MIN * 60 + @SEC Then
    $a_row0 = 0
    $aDatumForm = 0
    starte_ablauf()
    EndIf
    ElseIf $aDatumForm[3] * 365 + $aDatumForm[2] * 30 + $aDatumForm[1] < @YEAR * 365 + @MON * 30 + @MDAY Then
    $a_row0 = 0
    $aDatumForm = 0
    starte_ablauf()
    EndIf
    $zaehler_label = $zaehler_label + 1
    GUICtrlSetData($hzaehler_label, $zaehler_label)
    $a_row0 = 0
    $naechste_geplante_startdatum = 0
    $aDatumForm = 0
    EndFunc ;==>vergleiche_zeitstempel

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

    Func starte_ablauf()
    Local $sFehler, $sStatus, $ShellExecute
    Local $aBatch[5][5] = [[1, 1, $aLVERSATZ_bot[0][1], "Dateien erzeugen", ""], _
    [2, 2, $aLVERSATZ_bot[0][1], "Dateien von neu nach backup kopieren", ""], _
    [3, 3, $aLVERSATZ_bot[0][1], "Dateien von neu nach alt kopieren", ""], _
    [4, 4, $aLVERSATZ_bot[0][1], "Dateien verschieben", ""], _
    [5, 5, $aLVERSATZ_bot[0][1], "_neu_einplanen", ""]]

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

    ReDim $aLVERSATZ_top[5][2]
    For $i = 0 To UBound($aBatch) - 1
    $aLVERSATZ_top[$i][0] = $aBatch[$i][1] * 10
    $aLVERSATZ_top[$i][1] = $aBatch[$i][3]
    Next

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

    For $i = 0 To UBound($aBatch) - 1
    $sStatus = " ... wird gestartet"
    If $aBatch[$i][4] = "" Then
    $sFehler = " "
    _schreibe_log($sFehler, $aBatch[$i][4], $sStatus)
    $sFehler = "OK"
    $sStatus = " ... ist beendet"
    _schreibe_log($sFehler, $aBatch[$i][4], $sStatus)
    Else
    $sFehler = " "
    _schreibe_log($sFehler, $aBatch[$i][4], $sStatus)
    $ShellExecute = Run($aBatch[$i][4], "c:", @SW_HIDE)
    If $ShellExecute <> 0 Then
    $sFehler = "FEHLER"
    $sStatus = " Es ist ein Fehler aufgetreten."
    Else
    $sFehler = "OK"
    $sStatus = " ... ist beendet"
    EndIf
    _schreibe_log($sFehler, $aBatch[$i][4], $sStatus)
    EndIf

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

    If UBound($aLVERSATZ_top) = 1 Then
    $aLVERSATZ_top[0][0] = ""
    $aLVERSATZ_top[0][1] = ""
    Else
    _ArrayDelete($aLVERSATZ_top, 0)
    EndIf
    Next
    Sleep(1000)

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

    If UBound($aLVERSATZ_bot) = 1 Then
    $aLVERSATZ_bot[0][0] = ""
    $aLVERSATZ_bot[0][1] = ""
    $aLVERSATZ_bot[0][2] = ""
    Else
    _ArrayDelete($aLVERSATZ_bot, 0)
    EndIf
    $sFehler = 0
    $sStatus = 0
    $ShellExecute = 0
    $aBatch = 0
    lade_aktive_aps()
    EndFunc ;==>starte_ablauf

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

    Func beende_ablauf()
    AdlibUnRegister("vergleiche_zeitstempel")
    $ablaufstatus = False
    Return 0
    EndFunc ;==>beende_ablauf

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

    Func _exit()
    Exit
    EndFunc ;==>_exit

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

    Func _schreibe_log($sFehler, $sBefehl, $sStatus)
    Local $hfile
    $hfile = FileOpen("log_woBATCHwoSQLwoLV.txt", 1)
    FileWriteLine($hfile, "[" & @MDAY & "/" & @MON & "/" & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & "][" & $sFehler & "] " & $sBefehl & " " & $sStatus)
    FileClose($hfile)
    EndFunc ;==>_schreibe_log

    [/autoit]

    Grüße Yaerox

    Grüne Hölle

    2 Mal editiert, zuletzt von Yaerox (4. Februar 2013 um 09:16)

  • Also zumindestens ich werde aus deine Fehlerbeschreibung nicht schlau. Erklär mal etwas klarer dein Problem.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • 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

    Grüße Yaerox

    Grüne Hölle

    • Offizieller Beitrag

    Hilft dir das:

    [autoit]

    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

    [/autoit]

    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 :/

    Grüße Yaerox

    Grüne Hölle

  • Wenn es dir so um die Ressourcen geht, dann ist Autoit halt das falsche für deinen Anwendungsfall ;).

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • 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 :/

    Grüße Yaerox

    Grüne Hölle

  • 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

    Einmal editiert, zuletzt von autoBert (25. Januar 2013 um 15:05)

  • 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

    Grüße Yaerox

    Grüne Hölle

  • Nachdem ich nun mein Script langsam wieder zusammenflicken wollte, taucht auf einmal ein altes Problem auf 8| 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:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>

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

    Opt("GUIOnEventMode", 1)
    Opt("MustDeclareVars", 1)
    OnAutoItExitRegister("_exit")

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

    ; This is a flag to show whether we should check the timer or not
    Global $fCheck_Timer = True, $iBegin
    Global $aQueue[1][3]
    Global $aTasks[5][2]

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

    Global $hGUI = GUICreate("Aufgabenliste", 250, 390)

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

    Global $iCounter_label = 0
    Global $hCounter_label = GUICtrlCreateLabel("0", 50, 72, 200, 20)
    Global $hLoadBtn = GUICtrlCreateButton("Load", 140, 40, 100, 30)
    Global $hStartBtn = GUICtrlCreateButton("Start", 30, 5, 50, 30)
    Global $hStopBtn = GUICtrlCreateButton("Stop", 30, 40, 50, 30)

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

    GUISetState(@SW_SHOW, $hGUI)

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

    GUICtrlSetOnEvent($hLoadBtn, "_load")
    GUICtrlSetOnEvent($hStartBtn, "_check")
    GUICtrlSetOnEvent($hStopBtn, "_stop_working")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit", $hGUI)

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

    ; Set teh initial timestamp
    $iBegin = TimerInit()

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

    While 1
    Sleep(100)
    WEnd

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

    Func _load()
    $aQueue[0][0] = "0"
    $aQueue[0][1] = "18/01/2013 08:00:00"
    $aQueue[0][2] = "Test"
    EndFunc ;==>_load

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

    Func _check()
    AdlibRegister("_compare_datetimes", 1000)
    EndFunc ;==>_check

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

    Func _compare_datetimes()
    ConsoleWrite(@CR & @HOUR & ":" & @MIN & ":" & @SEC & ":" & @MSEC & " - " & $fCheck_Timer & " ==>> ")
    ; Should we check the timer?
    If $fCheck_Timer Then
    ; Have we waited 2 secs
    If TimerDiff($iBegin) > 1000 Then
    ConsoleWrite(@MIN&":"&@SEC&":"&@MSEC & " - ")
    ; Prevent any checking while the function runs
    $fCheck_Timer = False

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

    Local $aRow, $next_date, $aDate
    If UBound($aQueue) = 0 Then
    _stop_working()
    Return 0
    EndIf
    $aRow = StringSplit($aQueue[0][1], " ")
    $next_date = $aRow[1]
    $aRow = StringSplit($aRow[2], ":")

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

    $aDate = StringSplit($next_date, "/")

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

    If $aDate[3] * 365 + $aDate[2] * 30 + $aDate[1] = @YEAR * 365 + @MON * 30 + @MDAY Then
    If $aRow[1] * 3600 + $aRow[2] * 60 = @HOUR * 3600 + @MIN * 60 + @SEC Or $aRow[1] * 3600 + $aRow[2] * 60 < @HOUR * 3600 + @MIN * 60 + @SEC Then
    $aRow = 0
    $aDate = 0
    _start()
    EndIf
    ElseIf $aDate[3] * 365 + $aDate[2] * 30 + $aDate[1] < @YEAR * 365 + @MON * 30 + @MDAY Then
    $aRow = 0
    $aDate = 0
    _start()
    EndIf
    $iCounter_label = $iCounter_label + 1
    GUICtrlSetData($hCounter_label, $iCounter_label)
    $aRow = 0
    $next_date = 0
    $aDate = 0

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

    ConsoleWrite(@MIN&":"&@SEC&":"&@MSEC)

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

    $fCheck_Timer = True
    ; Reset the timestamp
    $iBegin = Timerinit()
    EndIf
    EndIf
    EndFunc ;==>_compare_datetimes

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

    Func _start()
    Local $sError, $sStatus, $ShellExecute
    Local $aBatch[5][5] = [[1, 1, $aQueue[0][1], "Task 1", "C:/Users/mwenzel/Documents/Testszenario/BATCH-Files/Dateienerzeugen/create_txt.bat"], _
    [2, 2, $aQueue[0][1], "Task 2", ""], _
    [3, 3, $aQueue[0][1], "Task 3", ""], _
    [4, 4, $aQueue[0][1], "Task 4", ""], _
    [5, 5, $aQueue[0][1], "_create_next_date", ""]]

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

    ReDim $aTasks[5][2]
    For $i = 0 To UBound($aBatch) - 1
    $aTasks[$i][0] = $aBatch[$i][1] * 10
    $aTasks[$i][1] = $aBatch[$i][3]
    Next

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

    For $i = 0 To UBound($aBatch) - 1
    $sStatus = " ... started"
    If $aBatch[$i][4] = "" Then
    $sError = " "
    _write_log($sError, $aBatch[$i][4], $sStatus)
    $sError = "OK"
    $sStatus = " ... finished"
    _write_log($sError, $aBatch[$i][4], $sStatus)
    Else
    $sError = " "
    _write_log($sError, $aBatch[$i][4], $sStatus)
    ;~ ConsoleWrite($aBatch[$i][4] & @CR)
    $ShellExecute = RunWait($aBatch[$i][4], "c:", @SW_HIDE)
    If $ShellExecute <> 0 Then
    $sError = "FEHLER"
    $sStatus = " Something went wrong."
    Else
    $sError = "OK"
    $sStatus = " ... finished"
    EndIf
    _write_log($sError, $aBatch[$i][4], $sStatus)
    EndIf

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

    If UBound($aTasks) = 1 Then
    $aTasks[0][0] = ""
    $aTasks[0][1] = ""
    Else
    _ArrayDelete($aTasks, 0)
    EndIf
    Next
    Sleep(1000)

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

    If UBound($aQueue) = 1 Then
    $aQueue[0][0] = ""
    $aQueue[0][1] = ""
    $aQueue[0][2] = ""
    Else
    _ArrayDelete($aQueue, 0)
    EndIf
    $sError = 0
    $sStatus = 0
    $ShellExecute = 0
    $aBatch = 0
    _load()
    EndFunc ;==>_start

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

    Func _stop_working()
    AdlibUnRegister("_compare_datetimes")
    Return 0
    EndFunc ;==>_stop_working

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

    Func _exit()
    Exit
    EndFunc ;==>_exit

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

    Func _write_log($sError, $sCommand, $sStatus)
    Local $hFile
    $hFile = FileOpen("log_wBATCHwoSQLwoLV.txt", 1)
    FileWriteLine($hFile, "[" & @MDAY & "/" & @MON & "/" & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & "][" & $sError & "] " & $sCommand & " " & $sStatus)
    FileClose($hFile)
    EndFunc ;==>_write_log

    [/autoit]

    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):

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <DateTimeConstants.au3>
    #include <EditConstants.au3>
    #include <GuiComboBox.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <SendMessage.au3>
    #include <SQLite.au3>
    #include <SQLite.dll.au3>
    #include <String.au3>
    #include <WindowsConstants.au3>
    #include <winapiex.au3>
    #include <Date.au3>

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

    Opt("GUIOnEventMode", 1)
    Opt("MustDeclareVars", 1)
    OnAutoItExitRegister("_exit")

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

    Local $fl_name = @scriptdir & '\memstats_b7.txt'

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

    Local $CheckingParameters = $CmdLine[0]
    If $CheckingParameters = 0 Then
    Global $usedb = IniRead("H:\AutoIt\Automatische Ablaufsteuerung\config.ini", "Datenbank", "pfad", "default")
    Global $path = IniRead("H:\AutoIt\Automatische Ablaufsteuerung\config.ini", "SQLite3.exe", "pfad", "default")
    Else
    Local $param = $CmdLine[1]
    Global $usedb = IniRead($param, "Datenbank", "pfad", "default")
    Global $path = IniRead($param, "SQLite3.exe", "pfad", "default")
    EndIf

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

    ; This is a flag to show whether we should check the timer or not
    Global $fCheck_Timer = True
    Global $iBegin, $fScriptstatus, $Row, $Query
    Dim $aQueue[1][4]
    ;~ Global $fl_name = @scriptdir & '\memstats.txt'

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

    _SQLite_Startup()
    Dim $DB = _SQLite_Open($usedb)

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

    ;#GUI 1
    Global $hGUI = GUICreate("GUI", 250, 390)

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

    Global $hMenuFile = GUICtrlCreateMenu("File")
    Global $hMenuFileExit = GUICtrlCreateMenuItem("Exit", $hMenuFile)
    Global $hMenuHelp = GUICtrlCreateMenu("?")
    Global $hMenuHelpHelp = GUICtrlCreateMenuItem("Help", $hMenuHelp)
    Global $hMenuHelpInfo = GUICtrlCreateMenuItem("Info", $hMenuHelp)

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

    Global $iCounter = 0
    Global $hCounter = GUICtrlCreateLabel("0", 50, 72, 200, 20)

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

    Global $gfx = GUICtrlCreateGraphic(5, 10, 18, 18)
    GUICtrlSetBkColor($gfx, 0xFF0000)
    GUICtrlSetColor($gfx, 0)

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

    Global $hBtnAdminTool = GUICtrlCreateButton("AdminTool", 160, 5, 80, 30)
    Global $hBtnLoad = GUICtrlCreateButton("Load", 140, 40, 100, 30)
    Global $astart_button = GUICtrlCreateButton("Start", 30, 5, 50, 30)
    Global $hBtnStart = GUICtrlCreateButton("Stop", 30, 40, 50, 30)

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

    GUISetState(@SW_SHOW, $hGUI)

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

    ;Aufgabenliste
    GUICtrlSetOnEvent($hMenuFileExit, "_exit")
    GUICtrlSetOnEvent($hMenuHelpHelp, "hilfe")
    GUICtrlSetOnEvent($hMenuHelpInfo, "info")
    GUICtrlSetOnEvent($hBtnLoad, "_load")
    GUICtrlSetOnEvent($astart_button, "_check")
    GUICtrlSetOnEvent($hBtnStart, "_stop")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit", $hGUI)

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

    _logmem("Scriptstart ---------")
    ;~ AdlibRegister("_ReduceMemory", 300000)
    ; Set teh initial timestamp
    $iBegin = TimerInit()

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

    While 1
    Sleep(100)
    WEnd

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

    Func _load()
    _logmem("_load BEGINNING")
    Dim $aStr
    Dim $a
    Local $i

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

    _logmem("_load SQL-1")
    _SQLite_Startup()
    $DB = _SQLite_Open($usedb)
    _logmem("_load SQL-1")

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

    _logmem("_load SQL-2")
    $Query = _sqlitequeryceck($DB, "SELECT id, geplante_startzeit, arbeitsplan_id FROM aufgabenliste ORDER BY geplante_startzeit ASC")
    While _SQLite_FetchData($Query, $Row) = $SQLITE_OK
    ReDim $aQueue[$i + 1][4]
    ;x = Row # y = Column
    $aQueue[$i][0] = $Row[0] ; Column 0 - ID
    $a = StringSplit($Row[1], " ")
    $aQueue[$i][1] = $a[1] ; Column 1 - Datum
    $aQueue[$i][2] = $a[2] ; Column 2 - Uhrzeit
    $aQueue[$i][3] = $Row[2] ; Column 3 - Arbeitsplan ID
    $i = $i + 1
    WEnd
    _SQLite_QueryFinalize($Query)
    _logmem("_load SQL-2")

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

    For $i = 0 To UBound($aQueue) - 1
    $aStr = StringSplit($aQueue[$i][1], "/")
    $aQueue[$i][1] = $aStr[3] & $aStr[2] & $aStr[1]
    Next
    For $i = 0 To UBound($aQueue) - 1
    $aQueue[$i][2] = StringMid($aQueue[$i][2], 1, 2) * 60 + StringMid($aQueue[$i][2], 4, 2)
    Next

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

    _logmem("_load before _Array2DSortFree")
    _Array2DSortFree($aQueue, '1|0')
    _logmem("_load after _Array2DSortFree")

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

    For $i = 0 To UBound($aQueue) - 1
    $aQueue[$i][1] = StringMid($aQueue[$i][1], 7, 2) & "/" & StringMid($aQueue[$i][1], 5, 2) & "/" & StringMid($aQueue[$i][1], 1, 4)
    Next
    For $i = 0 To UBound($aQueue) - 1
    If Mod($aQueue[$i][2], 60) = 0 Then
    If StringLen($aQueue[$i][2] / 60) = 2 Then
    $aQueue[$i][2] = ($aQueue[$i][2] / 60) & ":00"
    ElseIf StringLen($aQueue[$i][2] / 60) < 2 Then
    $aQueue[$i][2] = "0" & ($aQueue[$i][2] / 60) & ":00"
    EndIf
    Else
    If StringLen(Int($aQueue[$i][2] / 60)) = 2 Then
    If StringLen($aQueue[$i][2] - (Int($aQueue[$i][2] / 60) * 60)) = 2 Then
    $aQueue[$i][2] = Int($aQueue[$i][2] / 60) & ":" & $aQueue[$i][2] - (Int($aQueue[$i][2] / 60) * 60)
    ElseIf StringLen($aQueue[$i][2] - (Int($aQueue[$i][2] / 60) * 60)) < 2 Then
    $aQueue[$i][2] = Int($aQueue[$i][2] / 60) & ":0" & $aQueue[$i][2] - (Int($aQueue[$i][2] / 60) * 60)
    EndIf
    ElseIf StringLen(Int($aQueue[$i][2] / 60)) < 2 Then
    If StringLen($aQueue[$i][2] - (Int($aQueue[$i][2] / 60) * 60)) = 2 Then
    $aQueue[$i][2] = "0" & Int($aQueue[$i][2] / 60) & ":" & $aQueue[$i][2] - (Int($aQueue[$i][2] / 60) * 60)
    ElseIf StringLen($aQueue[$i][2] - (Int($aQueue[$i][2] / 60) * 60)) < 2 Then
    $aQueue[$i][2] = "0" & Int($aQueue[$i][2] / 60) & ":0" & $aQueue[$i][2] - (Int($aQueue[$i][2] / 60) * 60)
    EndIf
    EndIf
    EndIf
    Next
    For $i = 0 To UBound($aQueue) - 1
    $Query = _sqlitequeryceck($DB, "SELECT arbeitsplan_name FROM arbeitsplaene WHERE arbeitsplan_id=" & $aQueue[$i][3])
    While _SQLite_FetchData($Query, $Row) = $SQLITE_OK
    $aQueue[$i][0] = $aQueue[$i][0]
    $aQueue[$i][1] = $aQueue[$i][1] & " " & $aQueue[$i][2]
    $aQueue[$i][2] = $Row[0]
    WEnd
    _SQLite_QueryFinalize($Query)
    Next
    _SQLite_Close()
    _SQLite_Shutdown()
    _logmem("_load END")
    EndFunc ;==>_load

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

    Func _Array2DSortFree(ByRef $ARRAY, $sCOL_ASC, $NUM = False)
    _logmem("_Array2DSortFree BEGINNING")
    If Not IsArray($ARRAY) Then Return SetError(1, 0, 1)
    Local $tableStr = "CREATE TABLE [tblTEST] ("
    Local $insertStr = '', $insertBase = "INSERT INTO tblTEST VALUES ("
    Local $sortOrder = '', $sortStr = "SELECT * FROM tblTEST ORDER BY "
    Local $aResult, $asc, $iRows, $iCol, $hSQL
    $sCOL_ASC = StringStripWS($sCOL_ASC, 8)
    Local $ub2nd = UBound($ARRAY, 2)
    If @error = 2 Then
    If (StringLen($sCOL_ASC) > 3) Or (StringLeft($sCOL_ASC, 1) <> '0') Then Return SetError(2, 0, 1)
    If StringRight($sCOL_ASC, 1) = 0 Then
    _ArraySort($ARRAY)
    Else
    _ArraySort($ARRAY, 1)
    EndIf
    Return 0
    Else
    Local $aOut[UBound($ARRAY)][$ub2nd]
    EndIf
    If @error > 0 Then Return SetError(3, 0, 1)
    $hSQL = _SQLite_Open()
    If @error > 0 Then
    _SQLite_Close()
    _SQLite_Shutdown()
    Return SetError(3, 0, 1)
    EndIf
    For $i = 0 To UBound($ARRAY, 2) - 1
    $tableStr &= "'field" & $i & "',"
    Next
    $tableStr = StringTrimRight($tableStr, 1) & ");"
    For $i = 0 To UBound($ARRAY) - 1
    $insertStr &= $insertBase
    For $k = 0 To UBound($ARRAY, 2) - 1
    $insertStr &= "'" & $ARRAY[$i][$k] & "',"
    Next
    $insertStr = StringTrimRight($insertStr, 1) & ");"
    Next
    If _SQLite_Exec($hSQL, $tableStr & $insertStr) <> $SQLITE_OK Then
    _SQLite_Close()
    _SQLite_Shutdown()
    Return SetError(3, 0, 1)
    EndIf
    If StringInStr($sCOL_ASC, ',') Then
    Local $aOrder = StringSplit($sCOL_ASC, ',')
    For $i = 1 To UBound($aOrder) - 1
    If StringInStr($sCOL_ASC, '|') Then
    Local $var = StringSplit($aOrder[$i], '|')
    $asc = ' ASC'
    If $var[2] = 1 Then $asc = ' DESC'
    If $NUM Then
    $sortOrder &= 'ABS(field' & $var[1] & ')' & $asc & ','
    Else
    $sortOrder &= 'field' & $var[1] & $asc & ','
    EndIf
    Else
    _SQLite_Close()
    _SQLite_Shutdown()
    Return SetError(4, 0, 1)
    EndIf
    Next
    $sortOrder = StringTrimRight($sortOrder, 1) & ';'
    Else
    If (StringLen($sCOL_ASC) > 2) And (StringInStr($sCOL_ASC, '|')) Then
    Local $var = StringSplit($sCOL_ASC, '|')
    $asc = ' ASC'
    If $var[2] = 1 Then $asc = ' DESC'
    If $NUM Then
    $sortOrder &= 'ABS(field' & $var[1] & ')' & $asc
    Else
    $sortOrder &= 'field' & $var[1] & $asc
    EndIf
    Else
    _SQLite_Close()
    _SQLite_Shutdown()
    Return SetError(4, 0, 1)
    EndIf
    EndIf
    If _SQLite_GetTable2d($hSQL, $sortStr & $sortOrder, $aResult, $iRows, $iCol) <> $SQLITE_OK Then
    _SQLite_Close()
    _SQLite_Shutdown()
    Return SetError(3, 0, 1)
    EndIf
    For $i = 1 To UBound($aResult) - 1
    For $j = 0 To UBound($ARRAY, 2) - 1
    $ARRAY[$i - 1][$j] = $aResult[$i][$j]
    Next
    Next
    _SQLite_Exec($hSQL, "DROP TABLE tblTEST;")
    _SQLite_Close()
    _logmem("_Array2DSortFree END")
    Return 0
    EndFunc ;==>_Array2DSortFree

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

    Func _check()
    ;~ _logmem("_check BEGINNING")
    $fScriptstatus = True
    GUICtrlSetBkColor($gfx, 0x32CD32)
    AdlibRegister("_compate_datetimes", 1000)
    ;~ _logmem("_check END")
    EndFunc ;==>_check

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

    Func _compate_datetimes()
    ;~ _logmem("_compate_datetimes BEGINNING")
    Local $aSplit, $sNextplanneddate, $aDateform

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

    ; Should we check the timer?
    If $fCheck_Timer Then
    ; Have we waited 1 sec
    If TimerDiff($iBegin) > 1000 Then
    ; Prevent any checking while the function runs
    $fCheck_Timer = False

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

    If UBound($aQueue) = 0 Then
    _stop()
    Return 0
    EndIf
    $aSplit = StringSplit($aQueue[0][1], " ")
    $sNextplanneddate = $aSplit[1]
    $aSplit = StringSplit($aSplit[2], ":")

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

    $aDateform = StringSplit($sNextplanneddate, "/")

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

    If $aDateform[3] * 365 + $aDateform[2] * 30 + $aDateform[1] = @YEAR * 365 + @MON * 30 + @MDAY Then
    If $aSplit[1] * 3600 + $aSplit[2] * 60 = @HOUR * 3600 + @MIN * 60 + @SEC Or $aSplit[1] * 3600 + $aSplit[2] * 60 < @HOUR * 3600 + @MIN * 60 + @SEC Then
    $aSplit = 0
    $aDateform = 0
    start_working()
    EndIf
    ElseIf $aDateform[3] * 365 + $aDateform[2] * 30 + $aDateform[1] < @YEAR * 365 + @MON * 30 + @MDAY Then
    $aSplit = 0
    $aDateform = 0
    start_working()
    EndIf
    $iCounter = $iCounter + 1
    GUICtrlSetData($hCounter, $iCounter)

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

    $fCheck_Timer = True
    ; Reset the timestamp
    $iBegin = Timerinit()
    EndIf
    EndIf

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

    $aSplit = 0
    $sNextplanneddate = 0
    $aDateform = 0
    ;~ _logmem("_compate_datetimes END")
    EndFunc ;==>_compate_datetimes

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

    Func start_working()
    _logmem("start_working BEGINNING")
    Local $sError, $sStatus, $sNewStartDatetime, $ShellExecute, $aSQL[1][6], $aTasks[1][2], $i

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

    _SQLite_Startup()
    $DB = _SQLite_Open($usedb)

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

    $Query = _sqlitequeryceck($DB, "SELECT laufende_nr, arbeitspunkt_name FROM arbeitspunkte WHERE arbeitsplan_id=(SELECT arbeitsplan_id FROM aufgabenliste WHERE id=" & $aQueue[0][0] & ") AND status='Aktiv' ORDER BY laufende_nr ASC")
    While _SQLite_FetchData($Query, $Row) = $SQLITE_OK
    ReDim $aTasks[$i + 1][2]
    $aTasks[$i][0] = $Row[0]
    $aTasks[$i][1] = $Row[1]
    $i = $i + 1
    WEnd
    ;~ _SQLite_QueryFinalize($Query)

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

    $i = 0
    $Query = _sqlitequeryceck($DB, "SELECT a.arbeitsplan_id, ap.arbeitsplan_name, a.geplante_startzeit, app.arbeitspunkt_name, app.befehl, app.parameter FROM aufgabenliste a, arbeitsplaene ap, arbeitspunkte app WHERE a.arbeitsplan_id=(SELECT arbeitsplan_id FROM aufgabenliste WHERE id=" & $aQueue[0][0] & ") AND a.arbeitsplan_id=ap.arbeitsplan_id AND a.arbeitsplan_id=app.arbeitsplan_id AND app.status='Aktiv' ORDER BY app.laufende_nr")
    While _SQLite_FetchData($Query, $Row) = $SQLITE_OK
    ReDim $aSQL[$i+1][6]
    $aSQL[$i][0] = $Row[0]
    $aSQL[$i][1] = $Row[1]
    $aSQL[$i][2] = $Row[2]
    $aSQL[$i][3] = $Row[3]
    $aSQL[$i][4] = $Row[4]
    $aSQL[$i][5] = $Row[5]
    $i = $i + 1
    WEnd
    ;~ _SQLite_QueryFinalize($Query)

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

    _SQLite_Exec($DB, "UPDATE aufgabenliste SET startzeit=" & @HOUR & @MIN & @SEC & " WHERE id=" & $aQueue[0][0])
    ;~ , arbeitspunkt_id=(SELECT arbeitspunkt_id FROM arbeitspunkte WHERE arbeitsplan_id=(SELECT arbeitsplan_id FROM aufgabenliste WHERE id=" & _GUICtrlListView_GetItemText($a_listview_bot, 0, 0) & ") AND laufende_nr=" & _GUICtrlListView_GetItemText($a_listview_top, 0, 0) & ")
    ;~ _sqliteerrorcheck(@error)

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

    For $i = 0 To UBound($aSQL) - 1
    $sStatus = " ... wird gestartet"
    If $aSQL[$i][4] = "" Then
    $sError = " "
    _schreibe_log($sError, $aSQL[$i][0], $aSQL[$i][1], $aSQL[$i][2], $aSQL[$i][3], $aSQL[$i][4], $aSQL[$i][5], $sStatus)
    $sNewStartDatetime = _new_datetime($aSQL[$i][0])
    _SQLite_Exec($DB, "UPDATE aufgabenliste set geplante_startzeit='" & $sNewStartDatetime & "' WHERE arbeitsplan_id=" & $aSQL[$i][0])
    _sqliteerrorcheck(@error)
    $sError = "OK"
    $sStatus = " ... ist beendet"
    _schreibe_log($sError, $aSQL[$i][0], $aSQL[$i][1], $aSQL[$i][2], $aSQL[$i][3], $aSQL[$i][4], $aSQL[$i][5], $sStatus)
    Else
    $sError = " "
    _schreibe_log($sError, $aSQL[$i][0], $aSQL[$i][1], $aSQL[$i][2], $aSQL[$i][3], $aSQL[$i][4], $aSQL[$i][5], $sStatus)
    $aSQL[$i][4] = StringRegExpReplace($aSQL[$i][4], "\\", "/")
    $ShellExecute = RunWait($aSQL[$i][4], "c:", @SW_HIDE)
    If $ShellExecute <> 0 Then
    $sError = "FEHLER"
    $sStatus = " Es ist ein Fehler aufgetreten."
    Else
    $sError = "OK"
    $sStatus = " ... ist beendet"
    EndIf
    _schreibe_log($sError, $aSQL[$i][0], $aSQL[$i][1], $aSQL[$i][2], $aSQL[$i][3], $aSQL[$i][4], $aSQL[$i][5], $sStatus)
    EndIf
    $aTasks = 0
    Next

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

    Sleep(1000)
    _load()
    _SQLite_Close()
    _SQLite_Shutdown()

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

    _logmem("start_working END")
    EndFunc ;==>start_working

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

    Func _stop()
    _logmem("_stop BEGINNING")
    AdlibUnRegister("_compate_datetimes")
    $fScriptstatus = False
    GUICtrlSetBkColor($gfx, 0xFF0000) ;~ rot
    Return 0
    _logmem("_stop END")
    EndFunc ;==>_stop

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

    Func _add_date($day_to_add)
    ;~ _logmem("_add_date BEGINNING")
    Local $iDays_of_month, $mday, $mon, $year
    If @MON = 01 Or @MON = 03 Or @MON = 03 Or @MON = 05 Or @MON = 07 Or @MON = 08 Or @MON = 10 Or @MON = 12 Then
    $iDays_of_month = 31 ; großer Monat
    ElseIf @MON = 04 Or @MON = 06 Or @MON = 09 Or @MON = 11 Then
    $iDays_of_month = 30 ; mittlerer Monat
    ElseIf @MON = 02 Then
    If Mod(@YEAR, 4) = 0 Then
    $iDays_of_month = 29 ; Schaltjahr
    Else
    $iDays_of_month = 28 ; kleiner Monat
    EndIf
    EndIf

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

    If @MDAY + $day_to_add > $iDays_of_month Then ; Wenn Tage größer als Monat, Monat erhöhen
    If @MON + 1 > 12 Then ; Wenn Monat größer als 12 wird, Jahr erhöhen
    $mday = "01"
    $mon = "01"
    $year = @YEAR + 1
    Else
    $mday = "01"
    $mon = @MON + 1
    $year = @YEAR
    EndIf
    Else
    $mday = @MDAY + $day_to_add
    $mon = @MON
    $year = @YEAR
    EndIf

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

    If StringLen($mday) < 2 Then
    $mday = "0" & $mday
    EndIf
    If StringLen($mon) < 2 Then
    $mon = "0" & $mon
    EndIf
    If StringLen($year) < 2 Then
    $year = "0" & $year
    EndIf
    Return $mday & "/" & $mon & "/" & $year
    ;~ _logmem("_add_date END")
    EndFunc ;==>_add_date

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

    Func _add_time($sStarttime, $admze) ;~~>> admze = count of minutes !!
    ;~ _logmem("_add_time BEGINNING")
    Local $aStarttime = StringSplit($sStarttime, ":")
    Local $min, $hour, $admze_std, $admze_min
    If $admze > 60 Then
    $admze_std = Int($admze / 60, 0)
    $admze_min = Int(Mod($admze, 60))
    If $aStarttime[2] + $admze_min > 60 Then
    If $aStarttime[1] + $admze_std + 1 > 24 Then
    $min = ($aStarttime[2] + $admze_min) - 60
    $hour = 0
    Else
    $min = ($aStarttime[2] + $admze_min) - 60
    $hour = $aStarttime[1] + $admze_std + 1
    EndIf
    Else
    $min = $aStarttime[2] + $admze_min
    $hour = $aStarttime[1] + $admze_std
    EndIf
    Else
    If $aStarttime[2] + $admze > 60 Then
    If $aStarttime[1] + 1 > 24 Then
    $min = ($aStarttime[2] + $admze) - 60
    $hour = 0
    Else
    $min = ($aStarttime[2] + $admze) - 60
    $hour = $aStarttime[1] + 1
    EndIf
    ElseIf $aStarttime[2] + $admze = 60 Then
    If $aStarttime[1] + 1 > 24 Then
    $min = ($aStarttime[2] + $admze) - 60
    $hour = 0
    ElseIf $aStarttime[1] + 1 = 24 Then
    $min = "00"
    $hour = "00"
    Else
    $min = "00"
    $hour = $aStarttime[1] + 1
    EndIf
    Else
    $min = $aStarttime[2] + $admze
    $hour = $aStarttime[1]
    EndIf
    EndIf
    If StringLen($min) < 2 Then
    $min = "0" & $min
    EndIf
    If StringLen($hour) < 2 Then
    $hour = "0" & $hour
    EndIf
    $aStarttime = 0
    Return $hour & ":" & $min
    ;~ _logmem("_add_time END")
    EndFunc ;==>_add_time

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

    Func _sort_wday_array($ARRAY)
    ;~ _logmem("_sort_wday_array BEGINNING")
    If $ARRAY[1] = @WDAY Then
    Return $ARRAY
    Else
    For $i = 1 To $ARRAY[0]
    If $ARRAY[$i] > @WDAY Then
    $ARRAY = _sort_wday_array_increase($ARRAY)
    Return $ARRAY
    EndIf
    Next
    $ARRAY = _sort_wday_array_decrease($ARRAY)
    Return $ARRAY
    EndIf
    ;~ _logmem("_sort_wday_array END")
    EndFunc ;==>_sort_wday_array

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

    Func _sort_wday_array_increase($ARRAY)
    ;~ _logmem("_sort_wday_array_increase BEGINNING")
    Local $i
    _ArrayAdd($ARRAY, "")
    If $ARRAY[1] > @WDAY Then
    Else
    Do
    $ARRAY[$ARRAY[0] + 1] = $ARRAY[1]
    $i = 1
    Do
    $ARRAY[$i] = $ARRAY[$i + 1]
    $i = $i + 1
    Until $i = $ARRAY[0] + 1
    Until $ARRAY[1] = @WDAY Or $ARRAY[1] > @WDAY
    EndIf
    _ArrayDelete($ARRAY, UBound($ARRAY))
    Return $ARRAY
    ;~ _logmem("_sort_wday_array_increase END")
    EndFunc ;==>_sort_wday_array_increase

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

    Func _sort_wday_array_decrease($ARRAY)
    ;~ _logmem("_sort_wday_array_decrease BEGINNING")
    Local $i
    _ArrayAdd($ARRAY, "")
    Do
    $ARRAY[$ARRAY[0] + 1] = $ARRAY[1]
    $i = 1
    Do
    $ARRAY[$i] = $ARRAY[$i + 1]
    $i = $i + 1
    Until $i = $ARRAY[0] + 1
    Until $ARRAY[1] = @WDAY Or $ARRAY[1] < @WDAY
    _ArrayDelete($ARRAY, UBound($ARRAY))
    Return $ARRAY
    ;~ _logmem("_sort_wday_array_decrease END")
    EndFunc ;==>_sort_wday_array_decrease

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

    Func _new_datetime($ap_id)
    _logmem("_new_datetime BEGINNING")
    Local $Row, $Query, $day_to_add, $newDate, $TimeIncreased, $z
    $Query = _sqlitequeryceck($DB, "SELECT minute, wochentag, von, bis FROM zeitplan WHERE arbeitsplan_id=" & $ap_id)
    _SQLite_FetchData($Query, $Row)
    _sqliteerrorcheck(@error)
    _SQLite_QueryFinalize($Query)

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

    ;$Row[1] = $wochentag
    Local $aWday = StringSplit($Row[1], ",")
    $aWday = _sort_wday_array($aWday)

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

    If $Row[0] = "" Then ;FALL 1 - zu einer bestimmten Uhrzeit
    For $i = 1 To $aWday[0]
    If $aWday[$i] = @WDAY Then ;---Wochentag dabei---
    If $Row[3] > @HOUR & ":" & @MIN & ":" & @SEC Then ;Fall 1.1
    ;~ ConsoleWrite("Fall 1 . 1: Wochentag = Heute -> Uhrzeit noch nicht erreicht: " & @MDAY & "/" & @MON & "/" & @YEAR & " " & $Row[3] & @CR)
    Return @MDAY & "/" & @MON & "/" & @YEAR & " " & $Row[3]
    ElseIf $Row[3] < @HOUR & ":" & @MIN & ":" & @SEC Then ;Fall 1.2
    If $Row[1] = @WDAY Then ;Nur der Wochentag
    $day_to_add = 7
    Else
    If $aWday[2] = 1 Then
    $day_to_add = 7 - (($aWday[2] - @WDAY) * -1)
    ElseIf ($aWday[2] - @WDAY) > 0 Then
    $day_to_add = ($aWday[2] - @WDAY)
    ElseIf ($aWday[2] - @WDAY) < 0 Then
    $day_to_add = ($aWday[2] - @WDAY) + 7
    EndIf
    EndIf
    $newDate = _add_date($day_to_add)
    ;~ ConsoleWrite("Fall 1 . 2: Wochentag = Heute -> Uhrzeit vorbei: " & $newDate & " " & $Row[3] & @CR)
    Return $newDate & " " & $Row[3]
    EndIf
    EndIf
    Next
    ;---Wochentag NICHT dabei--- # Fall 1.3
    If ($aWday[1] - @WDAY) > 0 Then ; #1
    $day_to_add = ($aWday[1] - @WDAY)
    $newDate = _add_date($day_to_add)
    ;~ ConsoleWrite("Fall 1 . 3 #1: " & $newDate & " " & $Row[3] & @CR)
    Return $newDate & " " & $Row[3]
    ElseIf ($aWday[1] - @WDAY) < 0 Then ; #2
    $day_to_add = ($aWday[1] - @WDAY) + 7
    $newDate = _add_date($day_to_add)
    ;~ ConsoleWrite("Fall 1 . 3 #2: " & $newDate & " " & $Row[3] & @CR)
    Return $newDate & " " & $Row[3]
    EndIf
    Else
    For $i = 1 To $aWday[0] ;---Wochentag dabei---
    If $aWday[$i] = @WDAY Then
    If $Row[2] > @HOUR & ":" & @MIN & ":" & @SEC Then ;FALL 2.1
    ;~ ConsoleWrite("Fall 2 . 1: Wochentag = Heute -> Uhrzeit noch nicht erreicht: " & @MDAY & "/" & @MON & "/" & @YEAR & " " & $Row[2] & @CR)
    Return @MDAY & "/" & @MON & "/" & @YEAR & " " & $Row[2]
    ElseIf $Row[2] < @HOUR & ":" & @MIN & ":" & @SEC And @HOUR & ":" & @MIN & ":" & @SEC < $Row[3] Then ;FALL 2.2
    $z = 1
    Do
    $TimeIncreased = _add_time($Row[2], ($Row[0] * $z))
    $z = $z + 1
    Until $TimeIncreased > @HOUR & ":" & @MIN & ":" & @SEC

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

    If ($TimeIncreased < $Row[3]) Or ($TimeIncreased = $Row[3]) Then ;FALL 2.2
    ;~ ConsoleWrite("Fall 2 . 2 #1: " & @MDAY & "/" & @MON & "/" & @YEAR & " " & $TimeIncreased & @CR)
    Return @MDAY & "/" & @MON & "/" & @YEAR & " " & $TimeIncreased
    Else ;FALL 2.2 #2
    $aWday = _sort_wday_array($aWday)
    If $aWday[2] = 1 Then
    $day_to_add = 7 - (($aWday[2] - $z) * -1)
    ElseIf ($aWday[2] - @WDAY) > 0 Then
    $day_to_add = ($aWday[2] - $z)
    ElseIf ($aWday[2] - @WDAY) < 0 Then
    $day_to_add = ($aWday[2] - $z) + 7
    EndIf

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

    $newDate = _add_date($day_to_add)
    ;~ ConsoleWrite("Fall 2 . 2 #2: " & $newDate & " " & $Row[2] & @CR)
    Return $newDate & " " & $Row[2]
    EndIf
    ElseIf (@HOUR & ":" & @MIN & ":" & @SEC > $Row[3]) Or (@HOUR & ":" & @MIN & ":" & @SEC = $Row[3]) Then ;FALL 2.3
    $aWday = _sort_wday_array($aWday)
    For $i = 0 To UBound($aWday) - 1
    ;~ ConsoleWrite(@CR & "$aWday[$i]: " & $aWday[$i])
    Next
    If $Row[1] = @WDAY Then ;Nur der Wochentag
    $day_to_add = 7
    Else
    If $aWday[2] = 1 Then
    $day_to_add = 7 - (($aWday[2] - @WDAY) * -1)
    ElseIf ($aWday[2] - @WDAY) > 0 Then
    $day_to_add = ($aWday[2] - @WDAY)
    ElseIf ($aWday[2] - @WDAY) < 0 Then
    $day_to_add = ($aWday[2] - @WDAY) + 7
    EndIf
    EndIf
    $newDate = _add_date($day_to_add)
    ;~ ConsoleWrite("Fall 2 . 3: " & $newDate & " " & $Row[2] & @CR)
    Return $newDate & " " & $Row[2]
    EndIf
    EndIf
    Next
    If ($aWday[1] - @WDAY) > 0 Then ; #1
    $day_to_add = ($aWday[1] - @WDAY)
    $newDate = _add_date($day_to_add)
    ;~ ConsoleWrite("Fall 2 . 4 #1 " & $newDate & " " & $Row[2] & @CR)
    Return $newDate & " " & $Row[2]
    ElseIf ($aWday[1] - @WDAY) < 0 Then ; #2
    $day_to_add = ($aWday[1] - @WDAY) + 7
    $newDate = _add_date($day_to_add)
    ;~ ConsoleWrite("Fall 2 . 4 #2 " & $newDate & " " & $Row[2] & @CR)
    Return $newDate & " " & $Row[2]
    EndIf
    EndIf
    _logmem("_new_datetime END")
    EndFunc

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

    ; Hilfe MsgBox
    Func hilfe()
    MsgBox(64, "Hilfe", "Hilfe") ;~ COOMING SOON
    EndFunc ;==>hilfe

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

    ; Info MsgBox
    Func info()
    MsgBox(64, "Info", "Info") ;~ COOMING SOON
    EndFunc ;==>info

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

    Func _sqlitequeryceck($DB, $sQuery)
    Local $retQuery
    If _SQLite_Query($DB, $sQuery, $retQuery) <> 0 Then
    _sqliteerrorcheck(@error)
    _SQLite_QueryFinalize($retQuery)
    Return 0
    EndIf
    Return $retQuery
    EndFunc ;==>_sqlitequeryceck

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

    Func _sqliteerrorcheck($sql_error)
    If $sql_error = -1 Then
    ConsoleWriteError("Fehler, _SQLite_Exec Error: " & $sql_error & ". SQLite reported an error (Check return value)")
    ElseIf $sql_error = 1 Then
    ConsoleWriteError("Fehler, _SQLite_Exec Error: " & $sql_error & ". Error calling SQLite API 'sqlite3_exec'")
    ElseIf $sql_error = 2 Then
    ConsoleWriteError("Fehler, _SQLite_Exec Error: " & $sql_error & ". Call prevented by SafeMode")
    ElseIf $sql_error = 3 Then
    ConsoleWriteError("Fehler, _SQLite_Exec Error: " & $sql_error & ". Error Processing Callback from within _SQLite_GetTable2d")
    ElseIf $sql_error = 4 Then
    ConsoleWriteError("Fehler, _SQLite_Exec Error: " & $sql_error & ". Error while converting SQL statement to UTF-8")
    EndIf
    EndFunc ;==>_sqliteerrorcheck

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

    Func _schreibe_log($sError, $sAp_id, $sAp_name, $sGeplante_startzeit, $sApp_name, $sBefehl, $sParameter, $sStatus)
    Local $hfile = FileOpen("log11111111111.txt", 1)
    ;Beispiel: [12.11.2012 16:14:30][OK] Arbeitsplan_ID: 1 | Arbeitsplan_Name: AP 1 | Geplante_Startzeit: 16:00 | Arbeitspunkt_Name: Hello World | Status: wurde gestartet
    FileWriteLine($hfile, "[" & @MDAY & "/" & @MON & "/" & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & "][" & $sError & "] " & $sAp_id & " | " & _
    $sAp_name & " | " & $sGeplante_startzeit & " | " & $sApp_name & " | " & $sBefehl & " " & $sParameter & " | " & $sStatus)
    FileClose($hfile)
    EndFunc ;==>_schreibe_log

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

    Func _logmem($sPos)
    Local $hfl = FileOpen($fl_name,1)
    If $hfl = -1 Then MsgBox(0,'Memstats File Open Error','File Name = ' & $fl_name)

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

    Local $aMem = _winapi_getprocessmemoryinfo()

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

    FileWrite($hfl, StringFormat('Current Private Space = %010i ' & $aMem[0], $aMem[1], $aMem[2], $aMem[3], $aMem[4], $aMem[5], $aMem[6], $aMem[7], $aMem[8], $aMem[9]) & " " & $sPos & " [" & _now() & "]" & @lf)

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

    FileClose($hfl)
    $hfl = 0
    EndFunc

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

    Func _ReduceMemory($i_PID = -1)
    If $i_PID <> -1 Then
    ;kernel32.dll - OpenProcess - Opens an existing local process object.
    Local $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $i_PID)
    ;psapi.dll - EmptyWorkingSet - Removes as many pages as possible from the working set of the specified process.
    Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', $ai_Handle[0])
    ;kernel32.dll - CloseHandle - Closes an existing local process object.
    DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $ai_Handle[0])
    Else
    ;s.o.
    Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', -1)
    EndIf
    Return $ai_Return[0]
    EndFunc ;==>_ReduceMemory

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

    Func _exit()
    ;~ AdlibUnRegister("_ReduceMemory")
    _SQLite_Close($usedb)
    _SQLite_Shutdown()
    Exit
    EndFunc ;==>_exit

    [/autoit]

    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

    Grüße Yaerox

    Grüne Hölle