Critical

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

Critical , OnOffNumerisch

Parameter

OnOffNumerisch

Wenn leer oder weggelassen, wird standardmäßig On verwendet. Andernfalls geben Sie Folgendes an:

On: Der aktuelle Thread wird kritisch gemacht, d.h. er kann nicht von anderen Threads unterbrochen werden.

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 Millisekunden zu ändern, die zwischen den Überprüfungen der internen Meldungswarteschlange gewartet werden soll. Weitere Informationen finden Sie unter Meldungsüberprüfintervall. [v1.0.48+]: Die Angabe von 0 schaltet Critical aus. Die Angabe von -1 schaltet Critical ein, deaktiviert aber Meldungsüberprüfungen.

Verhalten von kritischen Threads

Kritische Threads sind unterbrechungsfrei; Einzelheiten finden Sie unter Threads.

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, wenn der Benutzer das Dialogfenster schließt.

Critical Off

Während gepufferte Ereignisse darauf warten, neue Threads zu starten, ist es nicht möglich, mit Critical Off eine sofortige Unterbrechung des aktuellen Threads zu bewirken. Stattdessen vergehen durchschnittlich 5 Millisekunden, bevor eine Unterbrechung erfolgt. Somit ist zu 99,999 % sichergestellt, dass mindestens eine Zeile nach Critical Off ausgeführt wird, bevor es zu einer Unterbrechung kommt. 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 threadspezifische Einstellung ist, deshalb wird, wenn ein kritischer Thread endet, der darunter liegende/fortgesetzte Thread (sofern vorhanden) automatisch unkritisch sein. Somit ist es nicht notwendig, Critical Off kurz vor dem Ende eines Threads auszuführen.

Wenn Critical im automatischen Ausführungsbereich (ganz oben im Skript) nicht verwendet wird, sind alle Threads zunächst unkritisch (obwohl die Einstellungen von Thread Interrupt weiterhin gelten). Wenn hingegen der automatische Ausführungsbereich Critical einschaltet, aber nie ausschaltet, ist jeder neue Thread (z.B. Hotkey, benutzerdefinierter Menüpunkt oder zeitgesteuerte Subroutine) zunächst kritisch.

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

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

Meldungsüberprüfintervall

[v1.0.47+]: Die Angabe einer positiven Zahl im ersten Parameter (z.B. Critical 30) schaltet Critical ein und ändert die Anzahl der Millisekunden, die mindestens zwischen den Überprüfungen der internen Meldungswarteschlange gewartet werden muss. Wenn keine Zahl angegeben ist, wird bei eingeschaltetem Critical standardmäßig 16 ms und bei ausgeschaltetem Critical standardmäßig 5 ms gewartet. 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 das Risiko, dass einzelne OnMessage-Rückrufe 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 zu umgehen, können Sie z.B. DllCall("Sleep", "UInt", 500) verwenden).

Diese Einstellung hat Einfluss auf Folgendes:

Die Einstellung hat keinen Einfluss auf die Häufigkeit der Meldungsüberprüfungen, während das Skript pausiert ist oder wartet.

Da der systeminterne Taktzähler in der Regel eine Granularität (Ungenauigkeit) von 15.6 Millisekunden hat, beträgt der minimale Deltawert grundsätzlich mindestens 15 oder 16. Die Dauer seit der letzten Überprüfung muss das angegebene Intervall überschreiten, damit eine weitere Überprüfung erfolgen kann. Zum Beispiel erfordert die Angabe von 16, dass sich der Taktzähler um 17 oder mehr ändert. Da eine Meldungsüberprüfung jederzeit innerhalb des 15.6-Millisekunden-Zeitfensters erfolgen kann, würde eine Angabe zwischen 1 und 16 zwei Meldungsüberprüfungen innerhalb eines einzigen Intervalls ermöglichen.

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

Critical -1 schaltet Critical ein, deaktiviert aber Meldungsüberprüfungen. Dadurch wird nicht verhindert, dass das Programm nach Meldungen sucht, während es einen Sleep-, Verzögerungs- oder Wartevorgang durchführt. Es ist nützlich in Fällen, wo das Senden von Meldungen den gerade ausgeführten Code stören könnte, z.B. bei der Verarbeitung bestimmter Meldungstypen während eines OnMessage-Rückrufs.

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

Beispiele

Drücken Sie einen Hotkey, um einen Tooltip für 3 Sekunden anzuzeigen. Wegen Critical wird jeder neue Thread, der während dieser Zeit gestartet wird (z.B. durch erneutes Drücken des Hotkeys), so lange hinausgezögert, bis der Tooltip verschwunden ist.

#space::  ; Hotkey: WIN+LEERTASTE.
Critical
ToolTip Neue Threads werden erst gestartet`, wenn dieser Tooltip verschwunden ist.
Sleep 3000
ToolTip  ; Tooltip ausschalten.
return  ; Die Rückkehr aus einer Hotkey-Subroutine beendet den Thread. Jeder darunter liegende Thread, der fortgesetzt werden soll, ist per Definition unkritisch.