Threads

Der aktuelle Thread ist laut Definition der Ausführungsablauf, den das jüngste Ereignis indirekt aufgerufen hat; dies können zum Beispiel Hotkeys, SetTimer-Subroutinen, benutzerdefinierte Menüpunkte und GUI-Ereignisse sein. Der aktuelle Thread kann Befehle innerhalb seiner eigenen Subroutine ausführen, oder innerhalb von anderen Subroutinen, die durch diese Subroutine aufgerufen wurden.

AutoHotkey ist eigentlich nicht in der Lage, mehrere Threads gleichzeitig auszuführen. Trotzdem kann es dieses Verhalten teilweise nachahmen: Beim Starten eines zweiten Threads -- z. B. durch Drücken eines weiteren Hotkeys, während der vorherige Hotkey noch läuft -- wird der aktuelle Thread unterbrochen (vorübergehend angehalten), so dass der neue Thread zum aktuellen Thread werden kann. Beim Starten eines dritten Threads, während der zweite Thread noch läuft, werden sowohl der zweite als auch der erste Thread in den Ruhezustand versetzt, und so weiter.

Sobald der aktuelle Thread endet, wird der vor kurzem unterbrochene Thread fortgesetzt, und so weiter, bis alle Threads letztendlich fertig sind. Wenn ein Thread fortgesetzt wird, werden seine Einstellungen wie ErrorLevel und SendMode automatisch wieder in den Zustand gesetzt, der kurz vor der Unterbrechung galt; das heißt, dass sich nichts ändern wird, nachdem ein Thread unterbrochen wurde (außer bei einer möglichen Änderung im aktiven Fenster).

Hinweis: Der Befehl bzw. Menüpunkt KeyHistory zeigt an, wie viele Threads im unterbrochenen Zustand sind. Der Befehl bzw. Menüpunkt ListHotkeys zeigt an, welche Hotkeys Threads haben.

Ein einzelnes Skript kann mehrere Dialogfenster wie MsgBox, InputBox, FileSelectFile und FileSelectFolder gleichzeitig haben. Dies kann durch Starten eines neuen Threads erreicht werden (via Hotkey, zeitgesteuerte Subroutine, benutzerdefinierter Menüpunkt und so weiter), während ein vorheriger Thread bereits ein Dialogfenster anzeigt.

Standardmäßig kann eine bereits laufende Hotkey- oder Hotstring-Subroutine nicht zum zweiten Mal ausgeführt werden. Mit #MaxThreadsPerHotkey kann dieses Verhalten geändert werden.

Siehe auch: Der Thread-Befehl bestimmt die Priorität oder Unterbrechbarkeit von Threads.

Thread-Priorität

Jeder Thread (Hotkey, zeitgesteuerte Subroutine, benutzerdefinierter Menüpunkt und so weiter), dessen Priorität niedriger ist als die Priorität des aktuellen Threads, kann ihn nicht unterbrechen. Während dieser Zeit werden solche Timer nicht laufen. Jeder Versuch des Benutzers, einen Thread zu erstellen (z. B. durch Drücken eines Hotkeys oder einer GUI-Schaltfläche), ist wirkungslos und wird nicht gepuffert. Aus diesem Grund ist es für gewöhnlich am besten, hoch-priorisierte Threads so aufzubauen, dass sie schnell zum Ende kommen, oder setze sie mit Critical auf hoher Priorität.

Die Standard-Priorität ist 0. Alle Threads verwenden die Standard-Priorität, sofern sie nicht durch eine der folgenden Methoden geändert wurde:
1) Eine zeitgesteuerte Subroutine kann von SetTimer eine bestimmte Priorität erhalten.
2) Ein Hotkey kann vom Hotkey-Befehl eine bestimmte Priorität erhalten.
3) Ein Hotstring kann beim Definieren oder von der #Hotstring-Direktive eine bestimmte Priorität erhalten.
4) Ein benutzerdefinierter Menüpunkt kann vom Menu-Befehl eine bestimmte Priorität erhalten.
5) Der aktuelle Thread kann seine eigene Priorität über den Thread-Befehl setzen.

Die OnExit-Subroutine (falls vorhanden) wird bei Aufruf immer laufen, egal welche Priorität der aktuelle Thread hat.

Thread-Unterbrechbarkeit

Bei den meisten Ereignissen dürfen neue Threads nur dann gestartet werden, wenn der aktuelle Thread unterbrechbar ist. Ein Thread kann zum Beispiel aufgrund folgender Fälle unterbrechungsfrei sein:

Verhalten von unterbrechungsfreien Threads

Im Gegensatz zu hochpriorisierten Threads werden Ereignisse, die während der unterbrechungsfreien Phase des Threads auftreten, nicht verworfen. Drückt der Benutzer beispielsweise einen Hotkey, während der aktuelle Thread unterbrechungsfrei ist, wird dieser Hotkey solange gepuffert, bis der aktuelle Thread endet oder unterbrechbar wird, erst dann wird der Hotkey als neuer Thread gestartet.

Jeder Thread kann im Notfall unterbrochen werden. Notfälle sind: 1) ein OnExit-Callback; 2) eine OnMessage-Funktion, die eine Meldungsnummer kleiner als 0x312 überwacht (oder ein Callback, das von so einer Meldung ausgelöst wird); und 3) ein Callback, das indirekt vom Thread selbst ausgelöst wird (z. B. via SendMessage oder DllCall). Um diese Unterbrechungen zu vermeiden, können solche Funktionen vorübergehend deaktiviert werden.

Ein kritischer Thread wird unterbrechbar, wenn ein Mitteilungsfenster oder ein anderes Dialogfenster angezeigt wird. Im Gegensatz zu Thread Interrupt wird der Thread allerdings wieder kritisch (und demzufolge unterbrechungsfrei), wenn der Benutzer das Dialogfenster schließt.