Moin,
Vorweg: da mein Programm zur Zeit mehr als 6800 Zeilen hat poste ich es hier erst einmal nicht.
In meinem Programm mit GUI nutze ich unter anderem per AdlibRegister()
- Funktion1 die per _Timer_GetIdleTime() auf den Bildschirmschoner achtet und bei Bedarf einen MouseMove macht (alle 1000ms)
- Funktion2 die auf Nachrichten eines Clients per TCP wartet - Client Connected, Client Disconnected und Nachrichten im JSON-Format (alle 50ms)
- Funktion3 die prüft ob das Programm selbst richtig läuft (ob Funktion 4 seine Arbeit macht oder ob es einen nicht korrigierbaren Fehler gab) (alle 6000ms)
- Funktion4 die Aufträge abarbeitet (alle 1000ms)
Alles natürlich im OnEventMode
Nun hatte ich es heute das z.B. eine Nachricht des Clients untergegangen ist (Funktion2 stand da noch auf 100ms)
Ich habe alle Funktionen überarbeitet so das diese sich wieder schnellstmöglich beenden (per Return),
bei Zeitkritischen Vorgängen halte ich sogar die ggf. störenden Funktionen an und starte diese hinterher wieder.
Ich hatte schon mit den Gedanken gespielt so viel wie möglich in jeweils eigene Programme (und damit .exe) auszulagern ... aber dann wird es mit der Kommunikation kompliziert.
Wichtig wäre mir das Funktion2 immer Nachrichten empfängt, die anderen Funktionen dürfen Ihre Arbeit dafür unterbrechen / pausieren.
Ich habe die AdlibRegister() so verstanden das
- Er die Funktion4 z.B, alle 1000ms aufruft
- In der Zeit in der Funktion4 läuft findet kein anderer Aufruf (z.B. von Funktion2 die ja alle 50ms laufen soll)
- Und wenn Funktion4 60 Sekunden braucht dann steht auch so lange alles andere
Ich hab mir Labels in die GUI gebaut die jedesmal die Farbe wechseln wenn die zugehörige Funktion aufgerufen wird. Das hat das ganze eher langsamer gemacht aber das vorher geschriebene meine ich dabei erkannt zu haben.
Nach ein wenig Googeln hatte ich diesen Beitrag aus dem Forum gefunden: Multithreading in autoit
@Mars schrieb dort folgendes:
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)
Hätte mal jemand ein paar Beispiele für mich was mit
- allgemeinere Callbacks
- geschicktes anwenden von Timern
gemeint ist?
Gibt es einen Befehl mit dem ich in der Funktion sagen kann "Arbeite mal eben deine AdlibRegister() ab und dann mache hier in der nächsten Zeile weiter"?
In Erwartung einer interessanten Diskussion,
BLinz