Multithreading in autoit

  • Hey leute :S

    Ist es möglich, autoit multithread-fähig zu machen?

    Sagen wir, es befinden sich 3 Funktionen im Script:

    [autoit]


    Func _test1()
    ConsoleWrite("test1"&@CRLF)
    Sleep(5000)
    EndFunc

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

    Func _test2()
    ConsoleWrite("test2"&@CRLF)
    Sleep(5000)
    EndFunc

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

    Func _test3()
    ConsoleWrite("test3"&@CRLF)
    Sleep(5000)
    EndFunc

    [/autoit]


    Funktionsaufruf _test1(), _test2(), _test3() bräuchte also minimal 15sek. wegen dem internen Sleep.
    Ist es möglich, Funktionen Parallel ablaufen zu lassen?
    Weshalb ich das frage:
    Wenn ich eine GUI basteln möchte in der ein Button ist der eine lange Berechnung durchführt, sollte trotzdem die GUI auch noch für andere Bereiche zugängig sein und nicht total abschalten bis die Funktion durchgelaufen ist.
    Lg!

    Edit: Über externe Scripts diese Funktionen einzeln aufzurufen wäre möglich, doch genau das möchte ich nicht, es soll alles in einem Script passieren ;)
    Dachte da vlt. an dll callen oder so etwas, aber keine Ahnung ob das geht, deswegen wollte ich erstmal euch fragen ;)

  • Ist es möglich, Funktionen Parallel ablaufen zu lassen?

    Nein.

    Wenn ich eine GUI basteln möchte in der ein Button ist der eine lange Berechnung durchführt, sollte trotzdem die GUI auch noch für andere Bereiche zugängig sein und nicht total abschalten bis die Funktion durchgelaufen ist.

    Benutze den OnEvent-Modus für die Verarbeitung / update während der Berechnung / arbeite die Rechnung in die Schleife ein.

  • Benutze den OnEvent-Modus für die Verarbeitung / update während der Berechnung / arbeite die Rechnung in die Schleife ein.

    Die GUI soll eben auch dann während der Berechnung noch auf andere Buttons reagieren können und dann seperat eben noch kleine Funktionen ausführen können während das große am laufen ist.

  • Genau das gleiche wie Photon wollte ich posten aber kam wohl ein paar Stunden zu spät, angeblich soll das mit den DllCalls gehen.
    Ansonsten bleibt nur die unkreative Variante der mehreren Scripte wobei die Zusammenführung der Ergebnisse aber schwierig wird.


    Nicht nur angeblich. Mit DllCalls funktioniert Multithreading in AutoIt, und mit "funktionieren" meine ich, dass das Skript in ca. 90% der Fälle abstürzt, da AutoIt das nicht mitmacht.

    Edit:

    Die GUI soll eben auch dann während der Berechnung noch auf andere Buttons reagieren können und dann seperat eben noch kleine Funktionen ausführen können während das große am laufen ist.


    Das wird sie auch können, solange deine "große" Berechnung aus mehren einzelnen Befehlen besteht und nicht nur ein Befehl ist der sehr lange zum Ausführen braucht (eigentlich sowieso nicht möglich; außer vielleicht bei DllCalls). Sie wird dann nur kurzzeitig unterbrochen. Ich nehme an, dass du nicht durchgehend auf irgendwelche Buttons klicken wirst.

    AutoIt Version (Prod): 3.3.14.2

    AutoIt Version (Beta): 3.3.9.5

    ausgewählte Skripte: Chatbot, komplexe Zahlen (UDF)

    2 Mal editiert, zuletzt von James (1. November 2013 um 16:31)

  • Es gibt kein Multithreading in AutoIt. AutoIts Interpreter kann nicht den Start von einem anderen Thread veranlassen ohne so viel globale Variablen intern zu erzeugen, dass die Ausführbarkeit unberechenbar wird. Oft genug diskutiert ;)

  • Multithreading ist möglich (auch ohne Abstürze), aber nur mit hohem Programmieraufwand durchführbar.
    Hab selbst mal eine GrafikEngine gebastelt die parallel zum eigentlichen Skript arbeitet, der dabei entstandene Overhead war aber relativ hoch, da AutoIt nicht dafür ausgelegt ist so zu arbeiten.

    Die Elegantere Methode ist der OnEventMode oder allgemeinere Callbacks. Damit lassen sich fast alle Skripte zufriedenstellend parallelisieren. Weiterhin ist geschicktes anwenden von Timern eine schöne Möglichkeit Funktionen parallel arbeiten zu lassen. (Dazu muss eine Funktion nur in einer (oder mehreren) Statischen Variable(n) ihren aktuellen Zustand speichern um später an der alten Stelle weitermachen zu können)

    Wer "echtes" Multithreading haben will um etwas parallel ausführen zu können, sollte sich lieber um eine anderweitige Struktur bemühen, zum schnelleren Rechnen sollte man auf BasicDlls (die wiederum echtes Multithreading beherrschen) zurückgreifen.

    Callbacks aus InlineASM/Dlls (zu AutoIt) führt zu Abstürzen, sobald der Interpreter meint in der AutoIt Funktion (die per Callback aufgerufen wurde) auf ein Event reagieren zu müssen. Daher sollte man Callbacks nur AutoIt intern benutzen, oder zur Zeit der aufrufenden Dll/ASM Funktion sämtliche Events temporär deaktivieren.

    Wurde alles schon etliche Male besprochen. Besser als Multithreading ist für fast alle Anwendungen eine anständige Programmstruktur !

    lg
    Mars

  • Hi,
    wie Oscar hier schön gezeigt hat, ist es kein Thema, auch in AutoIt 20 "parallele" Funktionen durcharbeiten zu lassen.
    Es ist halt, wie meistens, alles eine Frage des Knowhow´s.
    Und wenn ich mir die Fragestellung im Startpost anschaue, dann stelle ich mir ernsthaft die Frage ob auch nur rudimentäres Wissen zum Thema "Multithreading" vorhanden ist. Denn auch dieses würde das Problem nicht ansatzweise lösen können....soviel dazu!

    Multithreading funktioniert nur mit threadsicheren Funktionen, wer da nicht in der Lage ist etwas entsprechendes zu programmieren, der sollte in jeder (!) Programmiersprache die Finger davon lassen! Oder direkt die entsprechenden WinAPI-Funktionen nutzen....