Threads

Der aktuelle Thread ist per Definition der Ausführungsablauf, den das jüngste Ereignis indirekt aufgerufen hat; dies können z.B. Hotkeys, SetTimer-Subroutinen, benutzerdefinierte Menüpunkte und GUI-Ereignisse sein. Der aktuelle Thread kann Befehle innerhalb seiner eigenen Subroutine ausführen, oder innerhalb anderer 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 zuletzt 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, d.h. ein Thread wird keine unerwünschten Nebeneffekte durch eine Unterbrechung erfahren (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 kein zweites 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 in der Regel am besten, hochpriorisierte Threads so zu gestalten, dass sie schnell zum Ende kommen, oder Critical zu verwenden, anstatt ihre Priorität zu erhöhen.

Die Standardpriorität ist 0. Alle Threads verwenden die Standardpriorität, es sei denn, ihre Priorität wurde durch eine der folgenden Methoden geändert:

Der OnExit-Thread (falls vorhanden) wird bei Aufruf immer ausgeführt, unabhängig von der Priorität des aktuellen Threads.

Thread-Unterbrechbarkeit

Bei den meisten Ereignissen können neue Threads nur gestartet werden, wenn der aktuelle Thread unterbrechbar ist. Ein Thread kann aus verschiedenen Gründen unterbrechungsfrei sein, zum Beispiel:

Verhalten von unterbrechungsfreien Threads

Im Gegensatz zu hochpriorisierten Threads werden Ereignisse, die während der unterbrechungsfreien Phase des Threads auftreten, nicht verworfen. Wenn der Benutzer z.B. einen Hotkey drückt, 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 notfalls unterbrochen werden. Notfälle sind: 1) ein OnExit-Rückruf; 2) eine OnMessage-Funktion, die eine Meldungsnummer kleiner als 0x0312 überwacht (oder ein Rückruf, der von so einer Meldung ausgelöst wird); und 3) ein Rückruf, der 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 jedoch wieder kritisch (und somit unterbrechungsfrei), wenn der Benutzer das Dialogfenster schließt.