Paralleles arbeiten

  • Hi auto-it community,
    ich hab folgendes Problem es sollte mir möglich sein zwei aufgaben parallel arbeiten zu lassen.
    Hab inzwischen durch google rausgefunden das Multithreading nicht möglich ist in auto-it deswegen suche ich eine alternative.

    Zur Erklärung für was es benötigt wird:
    Es ist ein Skript das alle 10min den fülle Status von Ordner überprüft und gegebenenfalls Dateien löscht und/oder e-mail verschickt.
    Der andere teil besteht darin das einmal täglich eine große Anzahl an Dateien kopiert werden müssen und gezippt werden.

    Es muss keine kommunikation zwischen den zwei "Prozessen" herrschen.

    Adlib finde ich nicht angebracht weil die Datenübertragung nicht unnötig länger dauern sollte.

    Gibt es vll die Möglichkeit ein zweiten Prozess aus dem ersten zu starten ohne eine zweite Datei zu benutzen?

    MFG
    jojox

    Einmal editiert, zuletzt von jojox (25. Juli 2011 um 13:27)

  • Das hier hatte ich mal rausgesucht für einen Debugger:

    Spoiler anzeigen
    [autoit]

    If @Compiled Then
    If StringInStr($cmdlineraw, "*") = 0 Then ; Wenn kein Sternchen in der Kommandozeile steht
    If StringInStr($cmdlineraw, "-admin") = 0 Then ; Wenn nicht im Adminmodus gestartet wurde
    Opt("TrayIconHide", 1) ; Versteckt das Icon
    If @Compiled Then ; Wenn das Script compiliert ist
    $x = Run(@ScriptName & " *") ; Startet die kompilierte Exe normal
    Else ;Wenn das Script nicht compiliert ist
    $x = Run('"Autoit3.exe" "' & @ScriptFullPath & '" *') ; Startet das Script normal
    EndIf
    ProcessWait($x, 5) ; wartet auf das neu gestartete Script
    While ProcessExists($x) ; Während das neue Script läuft
    If WinActive("AutoIt Error") Then
    Sleep(100)
    _FileWriteLog(@ScriptDir & "\MIS Server\server.log", "Fehler im Programm")
    _OnAutoItError(WinGetText("AutoIt Error")) ; wartet auf das AutoIT Fehlerfenster
    EndIf
    Sleep(20) ;Schläft 20 Milisekunden
    WEnd
    Exit
    Else ; Wenn das Programm im Adminmodus gestartet wird, dann
    Opt("TrayIconHide", 1)
    If @Compiled Then
    $x = Run(@ScriptName & " * -admin") ;Startet die kompilierte mit Adminrechten
    Else
    $x = Run('"Autoit3.exe" "' & @ScriptFullPath & '" * -admin'); Startet das Script mit Adminrechten
    EndIf
    ProcessWait($x, 5)
    While ProcessExists($x) ; Während das neue Script läuft
    If WinActive("AutoIt Error") Then
    Sleep(100)
    _FileWriteLog(@ScriptDir & "\MIS Server\server.log", "Fehler im Programm")
    _OnAutoItError(WinGetText("AutoIt Error")) ; wartet auf das AutoIT Fehlerfenster
    EndIf
    Sleep(20) ;Schläft 20 Milisekunden
    WEnd
    Exit
    EndIf
    EndIf
    EndIf

    [/autoit]

    Wenn du dir es anschaust, siehst du, das du auch 2 Programme in einer Datei haben kannst, jeweils über Parameter beim starten ( Ich hatte einen Adminmodus eingebaut, um generelle Einstellungen zu ändern, die der normale Benutzer nicht ändern dürfen sollte ;) )

  • Für dein Vorhaben benötigst du kein Multithreading , du überprüfst einfach beim Start, ob das Datum , welches du nach dem Kopiervorgang in eine Ini schreibst,
    gleich dem aktuellen Datum ist, wenn nicht , dann führe den kopiervorgang aus , fürs zippen gibts ne UDF.

    Und die Funktion um alle 10 Minuten die Fülle eines Ordners zu überprüfen , kannst du mit Timern realisieren, kann man auch ganz anders lösen.(Sleep,Zeitmacros,....)

    MfG hellboy

    [autoit]

    Do
    _help($user)
    Until $questions = 0

    [/autoit]

    Meine Werke:
    Ste`s Web-Radio

  • TheLuBu
    wenn ich das richtig verstanden hab soll ich es so machen das ich die Datei ausführen dann die gleich Datei nochmal ausführen und mit irgend einem Übergabeparameter und somit zwei Prozesse laufen vom selben Programm aber verschiedene Sachen machen?

    @hellboy
    das Skript ist soweit fertig außer das beides gleichzeitig laufen soll. wenn ich die kopierfunktion starte dauert das um die 2-3 Stunden.
    in der zeit können dann keine warnmails versendet werden. außerdem soll das Programm 24/7 laufen.

  • TheLuBu
    danke past soweit denk ich mal ;)
    @Krabat
    danke aber hab oben schon geschrieben das die nicht so angebracht ist meiner meinung nach ;)

  • Ist zwar schon gelöst, aber ich wollte nur zeigen, dass man Adlibregister sehr wohl auch dafür nutzen kann.

    Spoiler anzeigen
    [autoit]

    If $CmdLine[0] = "" Then
    AdlibRegister("_Console", 1000)
    AdlibRegister("_MsgBox", 10000)
    Else
    _Blobb()
    EndIf

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

    While 1
    Sleep(200000)
    WEnd

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

    Func _Console()
    If @Compiled Then
    MsgBox(262144, "Kurzer Aufruf", @SEC, 1)
    Else
    ConsoleWrite(@SEC & @CR)
    EndIf
    EndFunc ;==>_Console

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

    Func _MsgBox()
    If @Compiled Then
    Run(@ScriptFullPath & " zweite")
    Else
    ConsoleWrite("BlaBla" & @CR)
    EndIf
    EndFunc ;==>_MsgBox

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

    Func _Blobb()
    MsgBox(4096 + 32, "Langer Aufruf", "Hallo, diese Funktion dauert ganz lange!!", 8)
    Exit
    EndFunc ;==>_Blobb

    [/autoit]


    Am besten kompiliert testen.

  • funkey
    danke, klar wäre das auch noch eine Möglichkeit, die sich aber nicht viel von der von TheLuBu unterscheidet.
    mir persönlich gefällt die Methode von TheLuBu besser aber ich denke mal das ist Geschmackssache.

  • Es ist zwar schon gelöst, aber hier noch eine vereinfachte Version von TheLuBus Idee:
    Da AutoIt Kommandozeilenparameter unterstützt, kannst du darüber festlegen, welche Aktion dein Skript ausführen soll, z.B.:

    [autoit]


    If $CMDLINE[0] > 0 And $CMDLINE[1] = "-docopy" Then
    _PerformCopy() ; kopieren
    Exit ; und beenden
    EndIf

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

    ; normales Programm
    ; Alle 10 Minuten prüfen + Mail senden
    ; Zu bestimmter Uhrzeit Kopiervorgang starten:
    ShellExecute(@AutoItExe, $CMDLINERAW & " -docopy") ; sich selbst starten + Parameter docopy

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

    Func _PerformCopy()
    ; hier kopieren
    EndFunc

    [/autoit]