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 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 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 erfolgt. Dadurch wird zu 99,999 % sichergestellt, dass mindestens eine Zeile nach Critical Off vor einer Unterbrechung ausgeführt wird. 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 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 vorerst unkritisch (es sei denn, Thread Interrupt wurde verwendet). Wird Critical hingegen im automatischen Ausführungsbereich eingeschaltet, aber nie ausgeschaltet, ist jeder neu gestartete Thread (z. B. Hotkey, benutzerdefinierter Menüpunkt oder zeitgesteuerte Subroutine) vorerst 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 Mindestanzahl der zu wartenden Millisekunden zwischen den Überprüfungen der internen Meldungswarteschlange. Wenn keine Zahl angegeben ist, wird bei eingeschaltetem Critical standardmäßig 16 ms und bei ausgeschaltetem Critical standardmäßig 5 ms verwendet. 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).

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, ist 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üfungsintervalls 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 Versenden von Meldungen den gerade ausgeführten Code stören könnte, z. B. bei der Verarbeitung bestimmter Arten von Meldungen während eines OnMessage-Callbacks.

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

Beispiele

Drücken Sie einen Hotkey, um einen Tooltip für 3 Sekunden anzuzeigen. Aufgrund von 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 verschwindet.

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