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 nicht vorhanden (oder "On") ist, wird der aktuelle Thread kritisch gemacht. Das heißt, dass dieser Thread nicht von anderen Threads unterbrochen werden kann. Enthält der erste Parameter das Wort Off (oder 0 seit v1.0.48), wird der aktuelle Thread sofort unterbrechbar, unabhängig von den Einstellungen in Thread Interrupt.

Verhalten von kritischen Threads

Im Gegensatz zu hoch-priorisierten Threads werden Ereignisse während eines kritischen Threads nicht verworfen. Drückt der Benutzer beispielsweise einen Hotkey, während der aktuelle Thread kritisch ist, wird dieser Hotkey auf unbestimmte Zeit zwischengespeichert, bis der aktuelle Thread endet oder unkritisch gemacht wird. Dabei wird der Hotkey als neuer Thread ausgeführt.

In Notfällen wird ein kritischer Thread unterbrochen. Notfälle sind: 1) OnExit-Subroutine; 2) OnMessage()-Funktion, die eine Meldungsnummer kleiner als 0x312 überwacht (oder ein Callback, der von so einer Meldung ausgelöst wird); und 3) Callback, der indirekt vom kritischen Thread selbst ausgelöst wird (z. B. mittels SendMessage oder DllCall). Um diese Unterbrechungen zu vermeiden, deaktiviert man solche Funktionen vorübergehend.

Ein kritischer Thread wird unterbrechbar, sobald 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

Bei zwischengespeicherten Ereignissen, die darauf warten, neue Threads zu starten, führt Critical Off nicht zu einer sofortigen Unterbrechung des aktuellen Threads. Stattdessen wird dieser Thread erst nach durchschnittlich 5 ms unterbrochen. Daher ist es zu mehr als 99,999 % wahrscheinlich, dass mindestens eine Zeile nach Critical Off ausgeführt wird, bevor eine Unterbrechung erfolgt. Sie können Unterbrechungen sofort wirksam werden lassen, wenn Sie eine Verzögerung wie Sleep -1 verwenden oder WinWait bei einem noch nicht existierenden Fenster anwenden.

Critical Off unterbricht die Nicht-Unterbrechbarkeit des aktuellen Threads, selbst wenn der Thread nicht Critical war, und lässt Ereignisse wie GuiSize demzufolge schneller oder vorhersehbarer durchführen.

Thread-Einstellungen

Siehe A_IsCritical für Informationen, wie die aktuelle Einstellung von Critical gespeichert oder wiederhergestellt werden kann. Da Critical jedoch eine thread-spezifische Einstellung ist, wird der darunterliegende/fortgesetzte Thread (sofern vorhanden) automatisch unkritisch, wenn ein kritischer Thread endet. Folglich gibt es keinen Grund, "Critical Off" ans Ende eines Threads zu setzen.

Solange Critical nicht im automatischen Ausführungsbereich (oberster Teil des Skripts) verwendet wird, starten alle Threads unkritisch (obwohl die Einstellungen von Thread Interrupt noch gelten). Aktiviert der automatische Ausführungsbereich hingegen Critical, wird jeder neu gestartete Thread (z. B. Hotkey, benutzerdefinierter Menüpunkt oder zeitgesteuerte Subroutine) von Beginn an kritisch sein.

Der Befehl Thread NoTimers ist vergleichbar mit Critical, außer dass dieser nur Unterbrechungen von Timern verhindern kann.

Seit v1.0.47 führt die Aktivierung von Critical dazu, dass SetBatchLines -1 für den aktuellen Thread wirksam wird.

Meldungsüberprüfungsintervall

Seit v1.0.47 führt die Angabe einer positiven Zahl im ersten Parameter (z. B. Critical 30) dazu, dass Critical aktiviert wird, sowie auch die Überprüfungsdauer in Millisekunden der internen Meldungswarteschlange geändert wird. Falls nichts angegeben ist, werden die Meldungen bei aktiviertem Critical alle 16 ms und bei deaktiviertem Critical alle 5 ms überprüft. Die Erhöhung des Intervalls führt auch dazu, dass der Empfang von Meldungen/Ereignissen nach hinten verschoben wird, wodurch der aktuelle Thread mehr Zeit hat, zu enden. Das verringert die Wahrscheinlichkeit, dass bestimmte OnMessage()- 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 (als Übergangslösung kann DllCall("Sleep", UInt, 500) verwendet werden). Hinweis: Ist das Meldungsüberprüfungsintervall zu hoch, könnte die Reaktionsfähigkeit von verschiedenen Ereignissen reduziert werden (z. B. beim Neuzeichnen eines GUI-Fensters).

Siehe auch

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

Beispiel

#space::  ; Hotkey: WIN+LEERTASTE
Critical
ToolTip Es wird kein neuer Thread gestartet, solange dieser ToolTip nicht verschwindet.
Sleep 3000
ToolTip  ; ToolTip ausschalten.
return  ; Beendet den Thread. Jeder darunterliegende Thread ist laut Definition unkritisch.