Threads

Der aktuelle Thread, auch genannt als Ausführungsablauf, wird vom aktuellsten Ereignis aufgerufen; dazu zählen Hotkeys, SetTimer-Subroutinen, benutzerdefinierte Menüpunkte und GUI-Ereignisse. 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.

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 GUI-Buttons), hat weder eine Wirkung noch wird er zwischengespeichert. 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.