Critical

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

Critical [, Off]
Critical 50 ; Siehe Bemerkungen.

Wenn der erste Parameter fehlt (oder das Wort On ist), wird der aktuelle Thread als kritisch eingestuft; das heißt, dass dieser Thread nicht von anderen Threads unterbrochen werden kann. Wenn der erste Parameter das Wort Off ist (oder in v1.0.48+ eine 0), wird der aktuelle Thread sofort unterbrechbar gemacht, unabhängig von den Einstellungen von Thread Interrupt.

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 auf unbestimmte Zeit zwischengespeichert. Sobald der aktuelle Thread endet oder unkritisch gemacht wird, 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 durch so eine Meldung ausgelöster Callback); und 3) ein Callback, der indirekt durch den kritischen Thread selbst ausgelöst wird (z. B. via SendMessage oder DllCall). Um diese Unterbrechungen zu vermeiden, deaktiviert man solche Funktionen vorübergehend.

Ein kritischer Thread wird unterbrechbar, wenn eine MsgBox 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 zwischengespeicherte Ereignisse darauf warten, neue Threads zu starten, kann Critical Off nicht genutzt werden, um eine sofortige Unterbrechung des aktuellen Threads herbeizuführen. Stattdessen werden durchschnittlich 5 Millisekunden vergehen, bevor es zu einer Unterbrechung kommt. 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 existierendem Fenster können sofortige Unterbrechungen erzwungen werden.

Critical Off bewirkt, dass der aktuelle Thread wieder unterbrochen werden kann, selbst wenn der Thread nicht via Critical als kritisch eingestuft wurde, wodurch Ereignisse wie GuiSize schneller oder vorhersehbarer verarbeitet werden können.

Thread-Einstellungen

Siehe A_IsCritical, wie man die aktuelle Einstellung von Critical speichert und wiederherstellt. Da Critical jedoch eine Thread-spezifische Einstellung ist, wird der darunterliegende/fortgesetzte Thread (sofern vorhanden) automatisch als unkritisch eingestuft, wenn ein kritischer Thread endet. Somit ist es nicht notwendig, "Critical Off" direkt vor dem Beenden eines Threads auszuführen.

Wenn Critical nicht im automatischen Ausführungsbereich (oberster Bereich des Skripts) angegeben ist, sind alle Threads zu Beginn unkritisch (obwohl die Einstellungen von Thread Interrupt weiterhin gültig sind). Wenn der automatische Ausführungsbereich hingegen Critical ein- aber nie ausschaltet, werden alle neu gestarteten Threads (z. B. Hotkey, benutzerdefinierter Menüpunkt oder zeitgesteuerte Subroutine) zu Beginn kritisch sein.

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

In v1.0.47+ bewirkt das Einschalten von Critical auch SetBatchLines -1 für den aktuellen Thread.

Meldungsüberprüfungsintervall

In v1.0.47+ wird, wenn man eine positive Nummer im ersten Parameter angibt (z. B. Critical 30), Critical eingeschaltet und die Dauer geändert, nach wie vielen Millisekunden die interne Meldungswarteschlange jedes Mal überprüft werden soll. Wenn keine Nummer angegeben ist, werden die Meldungen alle 16 ms überprüft, während Critical eingeschaltet ist, und alle 5 ms, während Critical ausgeschaltet ist. Die Erhöhung des Intervalls verzögert das Eintreffen von Meldungen/Ereignissen, was dem aktuellen Thread mehr Zeit zum Beenden gibt. Dies verringert die Chance, dass bestimmte OnMessage-Funktionen und GUI-Ereignisse aufgrund von "Thread wird bereits ausgeführt" verloren gehen. Wartende Befehle wie Sleep und WinWait werden Meldungen unabhängig 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 (z. B. GUI-Fenster neu zeichnen) beeinträchtigen.

Siehe auch

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

Beispiel

#space::  ; WIN+LEERTASTE
Critical
ToolTip Neue Threads werden erst gestartet`, wenn dieses ToolTip verschwindet.
Sleep 3000
ToolTip  ; Schaltet das ToolTip aus.
return  ; Wenn man eine Hotkey-Subroutine auf diese Weise verlässt, wird der Thread beendet. Jeder darunterliegende Thread, der wiederaufgenommen werden soll, ist per Definition unkritisch.