autoit gibte die daten nicht wieder frei

  • hi leute...es geht um folgendes...ich habe mir background program geschrieben, welches die ganze zeit im hintergrund läuft. dabei werden an einer stelle verschiedene prozesse abgefragt, ob diese gerade laufen. bei manchen sollen dann gewisse daten gesichert werden, sobald die nicht mehr laufen. wenn ich nun ein program (z.B. Baldurs Gate 2) starte befindet sich mein backgroundprogram wie angegeben im "schlafmodus" und sobald ich nun Baldurs Gate 2 beende sichert mein program gewisse daten und kopiert sie auf eine andere festplatte. das funktioniert auch super. doch sobald ich dann Baldurs Gate 2 erneut starte (nachdem der kopiervorgang beendet ist) und im spiel speicher will kommt die meldung, dass das spiel nicht gespeichert werden konnte. doch sobald ich nun mein backgroundprgram beende und es erneut versuche klappt es. wahrscheinlich gibt autoit die daten nicht wieder frei :( kann mir ein bei dem problem helfen? das problem entsteht allerdings nur wenn die funktion "_GUIBackUps($s_source, $s_destination)" aufgerufen wird.

    hier man codeausschnitte die vielleicht wichtig sein könnten:

    Spoiler anzeigen

    die überprüfung ob die prozesse gerade laufen oder nicht

    [autoit]

    For $i = 1 To $a_backups_process_schleife[0][0]
    If ProcessExists($a_backups_process_schleife[$i][1]) Then
    _ProcessWaitClose($a_backups_process_schleife[$i][1])
    Sleep(1000)
    If Ceiling(DirGetSize($a_backups_source_schleife[$i][1]) / 1024 / 1024) > 5 Then
    _GUIBackUps($a_backups_source_schleife[$i][1], $a_backups_destination_schleife[$i][1])
    Else
    DirCopy($a_backups_source_schleife[$i][1], $a_backups_destination_schleife[$i][1], 1)
    EndIf
    MsgBox(64, "Info", "Daten von '" & $a_backups_process_schleife[$i][1] & "' wurden erfolgreich gesichert!", 3)
    EndIf
    Next

    [/autoit]

    die funktion "GUIBackUps($s_source, $s_destination)" die wahrscheinlich für mein problem verantwortlich ist
    die funktion "_FileFindAll($s_source, $a_data)" dient nur zur rekursiven dateinfindung
    die funktion "_GetDataName($a_data[$i])" gibt, wie man sich bestimmt denken kann, lediglich den dateinamen zurück

    [autoit]

    Func _GUIBackUps($s_source, $s_destination)
    Local $a_data[1] = [0]

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

    _FileFindAll($s_source, $a_data)

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

    Local $h_GUI = GUICreate("Background - Backups", 300, 50, -1, -1, BitOR($WS_BORDER, $WS_POPUP))
    Local $h_label = GUICtrlCreateLabel("", 5, 5, 290, 20)
    Local $h_progress = GUICtrlCreateProgress(5, 25, 290, 20)
    GUISetState(@SW_SHOW, $h_GUI)

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

    For $i = 1 To $a_data[0]
    GUICtrlSetData($h_label, _GetDataName($a_data[$i]))
    GUICtrlSetData($h_progress, ($i / $a_data[0]) * 100)
    FileCopy($a_data[$i], $s_destination & "\" & StringTrimLeft($a_data[$i], StringLen($s_source)), 1 + 8)
    Next
    GUIDelete($h_GUI)
    EndFunc

    [/autoit]
  • Also vorläufiger Workaround bis den genauen Fehler gefunden hast, kannst ja am Ende der _GUIBackUps-Funktion das Script sich selbst einfach neu starten lassen.

    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.

  • Also vorläufiger Workaround bis den genauen Fehler gefunden hast, kannst ja am Ende der _GUIBackUps-Funktion das Script sich selbst einfach neu starten lassen.


    ist hier leider keine möglichkeit...das programm befindet sich im autostart und bevor es zur eigentlichen schleife kommt werden verschiedene dinge abgefragt und erledigt...bei einem neustart würde diese dinge nochmal ablaufen und das sollen die nicht :)


    Zeig mal die Funktion "_FileFindAll". Vielleicht wird dort das FileHandle nicht ordnungsgemäß geschlossen?!

    Gerade bei rekursiven Funktionen kann man schnell mal Fehler einbauen.

    hier ist die funktion

    Spoiler anzeigen
    [autoit]

    Func _FileFindAll($s_path, ByRef $a_found, $s_filetype = False, $s_filename = False)
    If $s_path = "" Or Not IsArray($a_found) Then Return SetError(-1)
    If StringRegExp(StringLeft($s_path, 1), "[a-zA-Z]") And StringMid($s_path, 2, 1) = ":" Then
    If StringRight($s_path, 1) <> "\" Then $s_path &= "\"
    Local $s_suchen, $s_weitersuchen, $i_ubound
    If $s_filetype And StringLeft($s_filetype, 1) <> "*" Then $s_filetype = "*" & $s_filetype
    $s_suchen = FileFindFirstFile($s_path & "*")
    If $s_suchen = -1 Then Return SetError(-2)
    While 1
    $s_weitersuchen = FileFindNextFile($s_suchen)
    If @error Then ExitLoop
    If @extended Then _FileFindAll($s_path & $s_weitersuchen & "\", $a_found, $s_filetype, $s_filename)
    If $s_filetype And Not $s_filename Then
    If StringRight($s_weitersuchen, StringLen($s_filetype) - 1) = StringTrimLeft($s_filetype, 1) Then
    $i_ubound = UBound($a_found, 1)
    ReDim $a_found[$i_ubound + 1]
    $a_found[$i_ubound] = $s_path & $s_weitersuchen
    EndIf
    ElseIf $s_filename And Not $s_filetype Then
    If StringLeft($s_weitersuchen, StringLen($s_filename)) = $s_filename Then
    $i_ubound = UBound($a_found, 1)
    ReDim $a_found[$i_ubound + 1]
    $a_found[$i_ubound] = $s_path & $s_weitersuchen
    EndIf
    ElseIf $s_filename And $s_filetype Then
    If (StringRight($s_weitersuchen, StringLen($s_filetype) - 1) = StringTrimLeft($s_filetype, 1)) And (StringLeft($s_weitersuchen, StringLen($s_filename)) = $s_filename) Then
    $i_ubound = UBound($a_found, 1)
    ReDim $a_found[$i_ubound + 1]
    $a_found[$i_ubound] = $s_path & $s_weitersuchen
    EndIf
    Else
    $i_ubound = UBound($a_found, 1)
    ReDim $a_found[$i_ubound + 1]
    $a_found[$i_ubound] = $s_path & $s_weitersuchen
    EndIf
    WEnd
    $a_found[0] = UBound($a_found) - 1
    Return $a_found
    Else
    Return SetError(-1)
    EndIf
    EndFunc

    [/autoit]

    jetzt wo du es sagst...bei mir fehlt doch nach der whileschleife ein fileclose($s_weitersuchen), oder? :)


  • ist hier leider keine möglichkeit...das programm befindet sich im autostart und bevor es zur eigentlichen schleife kommt werden verschiedene dinge abgefragt und erledigt...bei einem neustart würde diese dinge nochmal ablaufen und das sollen die nicht

    Naja, jetzt hast du ja eine Lösung, aber du kannst Programme neu starten lassen, ohne dass die "Anfangsdinge" ausgeführt werden ;)

    [autoit]


    If $CmdLine[0] = 0 Then
    ;Blabla
    EndIf

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

    ;Deine Schleife

    [/autoit]

    Und dann musst du aus deinem Programm heraus dein Programm mit einem Parameter starten ;) (DeinProgramm.exe -1)

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)


  • danke für den tipp ;) diese methode kannte ich noch nicht :)