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 auf den Stand unmittelbar vor der Unterbrechung zurückgesetzt; das heißt, dass ein Thread keine unerwünschten Nebeneffekte durch eine Unterbrechung erfahren wird (außer bei einer möglichen Änderung des aktiven Fensters).

Hinweis: Der Befehl/Menüpunkt KeyHistory zeigt an, wie viele Threads im unterbrochenen Zustand sind, und der Befehl/Menüpunkt ListHotkeys zeigt an, welche Hotkeys über Threads verfügen.

Ein einzelnes Skript kann mehrere Dialogfenster wie MsgBox, InputBox, FileSelectFile und FileSelectFolder zur gleichen Zeit anzeigen. Starten Sie hierfür einfach einen neuen Thread (via Hotkey, zeitgesteuerte Subroutine, benutzerdefinierter Menüpunkt und so weiter), während bereits ein Dialogfenster angezeigt wird.

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

Ein Thread (Hotkey, zeitgesteuerte Subroutine, benutzerdefinierter Menüpunkt und so weiter) mit einer niedrigeren Priorität als die des aktuellen Threads kann diesen nicht unterbrechen. In dieser Zeit werden derartige Timer nicht laufen, und jeder Versuch des Benutzers, einen Thread zu erstellen (z. B. durch Drücken eines Hotkeys oder einer GUI-Schaltfläche), wird weder funktionieren noch wird der Thread gepuffert. Aus diesem Grund ist es für gewöhnlich am besten, hochpriorisierte Threads so zu gestalten, dass sie schnell zum Ende kommen, oder verwenden Sie Critical, anstatt sie mit hoher Priorität zu versehen.

Die Standardpriorität ist 0. Alle Threads verwenden die Standardpriorität, es sei denn, ihre Priorität wurden durch eine der folgenden Methoden geändert:
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.