<script src="../static/ga4.js" type="text/javascript"></script> </head> <body> <h1>Threads</h1> <p>Der <em>aktuelle Thread</em> ist per Definition der Ausführungsablauf, den das jüngste Ereignis indirekt aufgerufen hat; dies können z.B. <a href="../Hotkeys.htm">Hotkeys</a>, <a href="../lib/SetTimer.htm">SetTimer-Subroutinen</a>, <a href="../lib/Menu.htm">benutzerdefinierte Menüpunkte</a> und <a href="../lib/Gui.htm#Events">GUI-Ereignisse</a> sein. Der <em>aktuelle Thread</em> kann Befehle innerhalb seiner eigenen Subroutine ausführen, oder innerhalb anderer Subroutinen, die durch diese Subroutine aufgerufen wurden.</p> <p>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 <em>aktuelle Thread</em> unterbrochen (vorübergehend angehalten), so dass der neue Thread zum <em>aktuellen Thread</em> 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.</p> <p>Sobald der <em>aktuelle Thread</em> 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 <a href="ErrorLevel.htm">ErrorLevel</a> und <a href="../lib/SendMode.htm">SendMode</a> 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 <a href="../lib/WinActivate.htm">aktiven Fensters</a>).</p> <p class="note"><strong>Hinweis:</strong> Der Befehl/Menüpunkt <a href="../lib/KeyHistory.htm">KeyHistory</a> zeigt an, wie viele Threads im unterbrochenen Zustand sind, und der Befehl/Menüpunkt <a href="../lib/ListHotkeys.htm">ListHotkeys</a> zeigt an, welche Hotkeys über Threads verfügen.</p> <p>Ein einzelnes Skript kann mehrere Dialogfenster wie <a href="../lib/MsgBox.htm">MsgBox</a>, <a href="../lib/InputBox.htm">InputBox</a>, <a href="../lib/FileSelectFile.htm">FileSelectFile</a> und <a href="../lib/FileSelectFolder.htm">FileSelectFolder</a> zur gleichen Zeit anzeigen. Starten Sie hierfür einfach einen neuen Thread (via <a href="../Hotkeys.htm">Hotkey</a>, <a href="../lib/SetTimer.htm">zeitgesteuerte Subroutine</a>, <a href="../lib/Menu.htm">benutzerdefinierter Menüpunkt</a> und so weiter), während bereits ein Dialogfenster angezeigt wird.</p> <p>Standardmäßig kann eine bereits laufende <a href="../Hotkeys.htm">Hotkey</a>- oder <a href="../Hotstrings.htm">Hotstring</a>-Subroutine kein zweites Mal ausgeführt werden. Mit <a href="../lib/_MaxThreadsPerHotkey.htm">#MaxThreadsPerHotkey</a> kann dieses Verhalten geändert werden.</p> <p><strong>Siehe auch:</strong> Der <a href="../lib/Thread.htm">Thread</a>-Befehl bestimmt die Priorität oder Unterbrechbarkeit von Threads.</p> <h2 id="Priority">Thread-Priorität</h2> <p>Ein Thread (<a href="../Hotkeys.htm">Hotkey</a>, <a href="../lib/SetTimer.htm">zeitgesteuerte Subroutine</a>, <a href="../lib/Menu.htm">benutzerdefinierter Menüpunkt</a> und so weiter) mit einer niedrigeren Priorität als die des <em>aktuellen Threads</em> 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 <a href="../Hotkeys.htm">Hotkeys</a> oder einer <a href="../lib/GuiControls.htm#Button">GUI-Schaltfläche</a>), 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 <a href="../lib/Critical.htm">Critical</a> zu verwenden, anstatt ihre Priorität zu erhöhen.</p> <p>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:</p> <ul> <li>Einer zeitgesteuerten Subroutine wird über <a href="../lib/SetTimer.htm">SetTimer</a> eine bestimmte Priorität zugewiesen.</li> <li>Einem Hotkey wird über den <a href="../lib/Hotkey.htm">Hotkey</a>-Befehl eine bestimmte Priorität zugewiesen.</li> <li>Einem <a href="../Hotstrings.htm">Hotstring</a> wird bei seiner Definition oder über die <a href="../lib/_Hotstring.htm">#Hotstring</a>-Direktive eine bestimmte Priorität zugewiesen.</li> <li>Einem benutzerdefinierten Menüpunkt wird über den <a href="../lib/Menu.htm">Menu</a>-Befehl eine bestimmte Priorität zugewiesen.</li> <li>Der <em>aktuelle Thread</em> setzt seine eigene Priorität via <a href="../lib/Thread.htm">Thread</a>-Befehl.</li> </ul> <p>Der <a href="../lib/OnExit.htm">OnExit</a>-Thread (falls vorhanden) wird bei Aufruf immer ausgeführt, unabhängig von der Priorität des <em>aktuellen Threads</em>.</p> <h2 id="Interrupt">Thread-Unterbrechbarkeit</h2> <p>Bei den meisten Ereignissen können neue Threads nur gestartet werden, wenn der aktuelle Thread <em>unterbrechbar</em> ist. Ein Thread kann aus verschiedenen Gründen <em>unterbrechungsfrei</em> sein, zum Beispiel:</p> <ul> <li>Der Thread wurde als <em>kritisch</em> markiert. <a href="../lib/Critical.htm">Critical</a> kann vom Thread selbst oder vom <a href="../Scripts.htm#auto">automatischen Ausführungsbereich</a> aufgerufen worden sein.</li> <li>Der Thread ist noch nicht lange genug gelaufen, um die Bedingungen für die Unterbrechbarkeit zu erfüllen, wie sie von <a href="../lib/Thread.htm#Interrupt">Thread Interrupt</a> festgelegt wurden.</li> <li>Eines der Menüs des Skripts wird gerade angezeigt (wie z.B. das <a href="../Program.htm#tray-icon">Tray-Symbol</a>-Menü oder eine Menüleiste).</li> <li>Es wird gerade eine Verzögerung durch <a href="../lib/Send.htm">Send</a> (meist aufgrund von <a href="../lib/SetKeyDelay.htm">SetKeyDelay</a>), <a href="../lib/WinActivate.htm">WinActivate</a> oder eine <a href="Clipboard.htm">Clipboard</a>-Operation durchgeführt.</li> <li>Ein <a href="../lib/OnExit.htm">OnExit</a>-Thread wird gerade ausgeführt.</li> <li>Ein Warndialogfenster wird gerade angezeigt, weil das <a href="../lib/_MaxHotkeysPerInterval.htm">#MaxHotkeysPerInterval</a>-Limit erreicht wurde oder ein Problem bei der Aktivierung des Tastatur- oder Maus-Hooks aufgetreten ist (sehr selten).</li> </ul> <h3 id="Behave">Verhalten von unterbrechungsfreien Threads</h3> <p>Im Gegensatz zu hochpriorisierten Threads werden Ereignisse, die während der unterbrechungsfreien Phase des Threads auftreten, nicht verworfen. Wenn der Benutzer z.B. einen <a href="../Hotkeys.htm">Hotkey</a> 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.</p> <p>Jeder Thread kann notfalls unterbrochen werden. Notfälle sind: 1) ein <a href="../lib/OnExit.htm#function">OnExit</a>-Rückruf; 2) eine <a href="../lib/OnMessage.htm">OnMessage</a>-Funktion, die eine Meldungsnummer kleiner als 0x0312 überwacht (oder ein <a href="../lib/RegisterCallback.htm">Rückruf</a>, der von so einer Meldung ausgelöst wird); und 3) ein <a href="../lib/RegisterCallback.htm">Rückruf</a>, der indirekt vom Thread selbst ausgelöst wird (z.B. via <a href="../lib/PostMessage.htm">SendMessage</a> oder <a href="../lib/DllCall.htm">DllCall</a>). Um diese Unterbrechungen zu vermeiden, können solche Funktionen vorübergehend deaktiviert werden.</p> <p>Ein <a href="../lib/Critical.htm">kritischer</a> Thread wird unterbrechbar, wenn ein <a href="../lib/MsgBox.htm">Mitteilungsfenster</a> oder ein anderes Dialogfenster angezeigt wird. Im Gegensatz zu <a href="../lib/Thread.htm#Interrupt">Thread Interrupt</a> wird der Thread jedoch wieder kritisch (und somit unterbrechungsfrei), wenn der Benutzer das Dialogfenster schließt.</p> </body> </html>