Critical

Verhindert, dass der aktuelle Thread von anderen Threads unterbrochen werden kann, oder macht ihn unterbrechbar.

Critical , OnOffNumerisch

Parameter

OnOffNumerisch

Wenn dieser Parameter weggelassen wird oder leer ist, wird standardmäßig On verwendet. Ansonsten kann eines der folgenden Dinge angegeben werden:

On: Der aktuelle Thread wird als kritisch eingestuft; das heißt, dass dieser Thread nicht von anderen Threads unterbrochen werden kann.

Off: Der aktuelle Thread wird sofort unterbrechbar gemacht, unabhängig von den Einstellungen von Thread Interrupt. Weitere Informationen finden Sie unter Critical Off.

(Numerisch) [v1.0.47+]: Geben Sie eine positive Zahl an, um Critical einzuschalten und die Anzahl der zu wartenden Millisekunden zwischen den Überprüfungen der internen Meldungswarteschlange zu ändern. Weitere Informationen finden Sie unter Meldungsüberprüfungsintervall. [v1.0.48+]: Die Angabe einer 0 schaltet Critical aus.

Verhalten von kritischen Threads

Im Gegensatz zu Threads mit hoher Priorität werden Ereignisse, die während eines kritischen Threads auftreten, nicht verworfen. Drückt der Benutzer beispielsweise einen Hotkey, während der aktuelle Thread kritisch ist, wird dieser Hotkey solange gepuffert, bis der aktuelle Thread endet oder unkritisch gemacht wird, erst dann wird der Hotkey als neuer Thread gestartet.

Ein kritischer Thread wird im Notfall unterbrochen. Notfälle sind: 1) die OnExit-Subroutine; 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 von dem kritischen 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, wenn der Benutzer das Dialogfenster schließt.

Critical Off

Während gepufferte Ereignisse darauf warten, neue Threads zu starten, ist es nicht möglich, Critical Off zu nutzen, um eine sofortige Unterbrechung des aktuellen Threads zu bewirken. Stattdessen vergehen durchschnittlich 5 Millisekunden, bevor eine Unterbrechung eintritt. Dadurch wird zu 99,999 % sichergestellt, dass mindestens eine Zeile nach Critical Off ausgeführt wird, bevor eine Unterbrechung erfolgt. Mit Mitteln wie Sleep -1 oder WinWait in Verbindung mit einem noch nicht existierenden Fenster können sofortige Unterbrechungen erzwungen werden.

Critical Off beendet die unterbrechungsfreie Phase des aktuellen Threads, auch wenn der Thread nicht kritisch war, so dass Ereignisse wie GuiSize früher bzw. vorhersehbarer abgearbeitet werden können.

Thread-Einstellungen

Schauen Sie sich A_IsCritical an, wie die aktuelle Einstellung von Critical gespeichert und wiederhergestellt werden kann. Beachten Sie, dass Critical eine thread-spezifische Einstellung ist, deshalb wird, wenn ein kritischer Thread endet, der darunterliegende/fortgesetzte Thread (sofern vorhanden) automatisch unkritisch sein. Somit ist es nicht notwendig, Critical Off kurz vor dem Beenden eines Threads durchzuführen.

Wenn Critical nicht im automatischen Ausführungsbereich (ganz oben im Skript) verwendet wird, sind alle Threads zu Beginn unkritisch (es sei denn, Thread Interrupt wurde verwendet). Wenn Critical im automatischen Ausführungsbereich eingeschaltet wird, ist jeder neu gestartete Thread (z. B. Hotkey, benutzerdefinierter Menüpunkt oder zeitgesteuerte Subroutine) zu Beginn kritisch.

Der Befehl Thread NoTimers ist quasi dasselbe wie Critical, aber er verhindert nur, dass Timer den aktuellen Thread unterbrechen können.

[v1.0.47+]: Beim Einschalten von Critical wird zudem SetBatchLines -1 für den aktuellen Thread wirksam.

Meldungsüberprüfungsintervall

[v1.0.47+]: Die Angabe einer positiven Zahl im ersten Parameter (z.B. Critical 30) schaltet Critical ein und ändert die Anzahl der zu wartenden Millisekunden zwischen den Überprüfungen der internen Meldungswarteschlange. Wenn keine Zahl angegeben ist, werden die Meldungen bei eingeschaltetem Critical alle 16 ms und bei ausgeschaltetem Critical alle 5 ms überprüft. Die Erhöhung des Intervalls verzögert das Eintreffen von Meldungen/Ereignissen, so dass der aktuelle Thread mehr Zeit für seine Beendigung hat. Dies verringert die Chance, dass einzelne OnMessage-Threads und GUI-Ereignisse aufgrund von "Thread wird bereits ausgeführt" verloren gehen. Wartende Befehle wie Sleep und WinWait werden Meldungen unabhängig von dieser Einstellung überprüfen (um das umgehen, können Sie z. B. DllCall("Sleep", "UInt", 500) nutzen).

Hinweis: Eine zu starke Erhöhung des Meldungsüberprüfungsintervalls kann die Reaktionsfähigkeit verschiedener Ereignisse wie z. B. GUI-Fenster-Neuzeichnungen verringern.

Siehe auch

Thread (Befehl), Threads, #MaxThreadsPerHotkey, #MaxThreadsBuffer, OnMessage(), RegisterCallback(), Hotkey, Menu, SetTimer

Beispiele

#1

#space::  ; Hotkey: WIN+LEERTASTE.
Critical
ToolTip Neue Threads werden erst gestartet`, wenn dieses ToolTip verschwindet.
Sleep 3000
ToolTip  ; Schaltet das ToolTip aus.
return  ; Die Rückkehr aus einer Hotkey-Subroutine beendet den Thread. Jeder darunterliegende Thread, der fortgesetzt werden soll, ist per Definition unkritisch.