2 Funktionen gleichzeitig machen.

  • Hallo
    ist es möglich 2 Funktionen gleichzeit abzulaufen lassen mit 1 Script ?
    Habe mal gesehn das man z.b. bei einer MSG nicht wartetn musste das die nächste rauskommt.
    Gibt es da irgent welche möglichkeiten ?

  • Hi,

    zu Deiner Frage: nein, aber.........

    Du kannst mit den Funktionen AdLibEnable () AdLibDisable () eine fast parallele Abarbeitung abbilden. Schau mal in der Hilfe....

    Gffs. gibt es noch eine Möglichkeit per DLL Aufruf, die mir aber bis dato nicht untergekommen ist.


    ;-))
    Stefan

  • Kann man mit AdlibEnable machen (bei der Beta glaub ich AdlibRegister)

    Spoiler anzeigen
    [autoit]

    AdlibEnable("_Funktion2", 200)

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

    _Funktion1()

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

    Func _Funktion1()
    For $i = 1 To 10000
    Next
    MsgBox(0, "Funktion Nummer 1", "$i = " & $i)
    EndFunc

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

    Func _Funktion2()
    For $j = 1 To 10000
    Next
    MsgBox(0, "Funktion Nummer 2", "$j = " & $j)
    AdlibDisable()
    EndFunc

    [/autoit]

    Bin heute glaub ich bisschen langsam^^

  • Du könntest theoretisch Pseudo-Multithreading einbauen, indem du deine Funktion in seeehr viele kleine Unterfunktionen unterteilst und dann ggf. mit Timern oder sonstigem arbeitest.. ich hab diese idee schon ein bisschen länger bin aber selbst noch nich dazu gekommen das mal irgenwo umzusetzen.. werde das aber im laufe der Woche mal ausprobieren.

    *alle angaben ohne gewähr*

  • Wenn es um rechenintensive Anwendungen geht, dann kann man das "Pseudo-MultiThreating" statt kompliziert im Code direkt von dem machen lassen, der dafür schon alles eingerichtet hat, nämlich Windows!
    Gerade bei Multikernsystemen macht das Sinn, da man Windows veranlassen kann bestimmte Programme an bestimmte Prozessorkerne zu binden. Beispiel AES-Verschlüsselung bzw. Erzeugung der Schlüssel.
    Wenn man 4 Dateien mit 4 unterschiedlichen Schlüsseln verschlüsseln möchte, dann kann man das im Code natürlich irgendwie "parallel" machen, allerdings wird das Programm sowieso nur seriell auf einem Prozessorkern abgearbeitet, und man benötigt 4 (für jede Datei eine) Zeiteinheiten.
    Teilt man das Problem in 4 Programme auf (jedes Programm an einen Prozessorkern gebunden), dann benötigt man nur EINE Zeiteinheit, da auf jedem Prozessorkern die Verschlüsselung nur eine Zeiteinheit dauert. Läppische Geschwindigkeitssteigerung durch paralleles Abarbeiten um den Faktor 4!
    Aber wie peethebee schon geschrieben hat, funktioniert das nur, wenn die einzelnen "Threads" nicht voneinander abhängig sind.

    Und wenn es um richtig "lange" Berechnungen geht, dann wäre auch eine Verteilung an andere Rechner im Netzwerk möglich....CloudComputing ist da wohl das neue Modewort (vgl BOINC), seti@home hat das schon vor Jahren gemacht^^

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (5. November 2009 um 21:39)

  • SEuBo:
    Das hilft nur dann, wenn die Funktionen sich nicht nacheinander gegenseitig aufrufen ;).


    So wie ich das verstanden habe bringt das nichts, bin aber mal auf den Ansatz von SEuBo gespannt.
    Das Problem in mehrere Skripten zu verteilen kann Vorteile bringen, nur mit einem einheitliches Konzept wird man da nicht weit kommen.


    Aber geschichte Verlagerung von Code in oder aus der Hauptschleife kann manches Problem in der Richtung lösen.


    Das soweiso, nur wie hilft es dabei mehrere Funktionen "gleichzeitig" auszuführen?

    • Offizieller Beitrag

    Beispielsweise in GUIOnEvent-Funktionen eine globale TaskQueue füllen und dann die Funktion beenden. Damit ist die GUI wieder responsive. Dann kann man in der Hauptschleife zu geeigneten Zeitpunkten und in passenden Häppchen die Tasks abarbeiten (wobei man das Abarbeiten dann mit AdlibRegister oder Timern noch etwas entkoppeln kann).
    Grundsätzlich ist Multithreading ein komplexes Thema, das viel Vorüberlegung und Geschick braucht. Allgemeine Lösungen sind nicht so einfach zu geben ;).

    Johannes

  • Zitat

    Dann kann man in der Hauptschleife zu geeigneten Zeitpunkten und in passenden Häppchen die Tasks abarbeiten (wobei man das Abarbeiten dann mit AdlibRegister oder Timern noch etwas entkoppeln kann).[

    ...in einem Satz das gesamte Elend beschrieben^^
    Das funktioniert im grossen und ganzen schon, aber nur solange man VORHER weiss, welcher "Task" wie lange für die Berechnung braucht. Oder man verwendet "kooperatives Multitasking " und überlässt den einzelnen Prozessen selbst die Macht, die Dauer ihrer Aktivität zu bestimmen. Bei Dateioperationen z.B. wäre es übel, mitten im Schreiben von einigen anderen Tasks "abgeklemmt" zu werden..

    Die Verteilung der Zeitscheiben an die einzelnen Prozesse (ggf. Anforderung weiterer Zeit bei besonders dringenden Aktionen) halte ich dagegen für einfacher realisierbar....ggf. würde auch eine Mischform von kooperativem und präemptivem "Multitasking" irgendwie funktionieren. Wobei ich mir sicher bin, dass der Verwaltungsaufwand in keiner Relation zur "eingesparten Zeit" steht!
    Da wäre in den meisten Fällen eine serielle Abarbeitung schneller!

  • Mal eine dumme Frage: eigentlich ist es doch in Autoit fast unmöglich Multithreading zu realisieren, denn die Standart-Funktionen blocken ja alle, d.h ist es ja egal, ob ich zB eine GUI aufbaue und "parallel" dazu zB eine Datei aus dem Internet herunterlade (dummes Beispiel, schließlich ist INetGet ja per Parameter so modifizierbar, dass es nicht blockt :S ). Letztenendes läuft es doch auf dieselbe Rechenzeit hinaus, ob ich diese Vorgänge nun sequentiell oder quasi-parallel abarbeite?! Sry ich bin schon ein bisschen müde, ich sollte jetzt ins Bett gehen

  • Zitat

    denn die Standart-Funktionen blocken ja alle,

    [autoit]

    AdlbRegister() AdlibEnable()

    [/autoit]

    sind für (gegen) diese blockenden Funktionen gedacht.

    Zitat

    Letztenendes läuft es doch auf dieselbe Rechenzeit hinaus, ob ich diese Vorgänge nun sequentiell oder quasi-parallel abarbeite?

    Auf einer Einprozessormaschine auf jeden Fall! Bei Multitasking/-threating geht es aber nicht primär um die Rechenzeit an sich, sondern darum, dem Benutzer keine Wartezeit bei seiner Interaktion mit dem Rechner zuzumuten.
    Beispiel zum Thema Geschwindigkeit:
    Mal angenommen, der Rechner ist mit 1Ghz getaktet, das wären dann (1000(kilo)*1000(mega)*1000(giga)) Takte, die ein Prozessor pro Sekunde abarbeiten kann. Mal weiter angenommen, der User arbeitet an einer Textverarbeitung bei der die Abfrage des Tastaturinterrupts incl Darstellung der gedrückten Taste auf dem Bildschirm 1000 Takte dauert....dann wäre es doch nicht verkehrt, in der restlichen Zeit (pro Sekunde macht der Prozessor eine Million mal garnichts! ) andere Aufgaben bewältigt werden könnten. Aber so, dass der User davon bei seiner Arbeit nicht beeinträchtigt wird! Man könnte in dieser Zeit z.B. ein Video rendern oder andere Sachen machen. Aber alles nur, solange der User bei seiner eigentlichen Arbeit (Texte tippen) nicht eingeschränkt oder behindert wird....Das heisst im Klartext, daß der Rechner in Sekundenbruchteilen entscheiden muß, was der User gerade macht oder aber auch in Zukunft machen möchte! Zehn geöffnete Fenster auf dem Desktop, eine laufende Datensicherung, Internetverbindung, der Musikplayer spielt, Chatfenster wird benutzt uswusf...Da hat der Rechner allein mit der Verwaltung der Tasks eine Höllenarbeit, und alles so, daß der User nicht über den "lahmen Computer" meckert! Dabei macht selbst der lahmste Computer in 99,99999% all seiner Lebenszeit.....NICHTS anderes als auf Eingaben des Users zu warten....