Critical

現在のスレッドへの割り込みを禁止する

Critical[,MessageCheckInterval]
Critical,Off
Critical

Parameters

引数名説明
MessageCheckInterval Critical状態の間のウィンドウメッセージのチェック間隔をミリ秒で指定する。
デフォルトは16ミリ秒。
非Critical状態では、5ミリ秒間隔でチェックされる。
大きな値を指定して、メッセージのチェックを行われないようにしても、実行速度はごくわずかしか向上しない。
Off 第1引数に「Off」を指定すると、Critical状態を解除し、割り込みを受け付けるようにする

Remarks

スレッドの優先順位による割り込み防止と違い、スレッドがCritical状態の時に割り込もうとしたイベントは、一時的に保存され、スレッドがCriticalでなくなったときに割り込みが発生する。

保存されたスレッドがあるときに「Critical,Off」を実行した場合、割り込みが行われるのは約5ミリ秒後になる。
多くの場合、この間にスクリプトの続きが数行実行される。
「Critical,Off」した直後に確実に割り込みを発生させたい場合、「Sleep,-1」を実行するようにすればいい。

GUIウィンドウのイベントや、OnMessage()で割り当てられたメッセージイベントのためのメッセージチェックは、MessageCheckIntervalで指定した間隔で行われる。
メッセージイベントの実行中に同じメッセージを受け取った場合などには、実行されずに無視されてしまう。
CriticalでMessageCheckIntervalを大きくして、メッセージのチェックが行われる前にスレッドを終了させれば、スレッドが終了してからメッセージがチェックされるので、メッセージが無視されることを防げる。

MessageCheckIntervalの指定にかかわらず、SleepコマンドやWinWaitコマンドなどの処理を停止するコマンドを実行した場合、メッセージのチェックが行われる。
メッセージをチェックさせずに停止させたい場合、「DllCall("kernel32.dll\Sleep", "UInt", 500))」のようにすればよい。

OnExitで設定されたプログラム終了イベントおよびOnMessage()で0x312番未満のメッセージに割り当てられたイベント、これらのメッセージやCritical状態のスレッドから呼び出されたコールバック関数は、Critical状態でも割り込みが行われる。
これらの割り込みも禁止したい場合は、一時的にイベントの割り当てを解除する。

MsgBoxなどでダイアログが表示されている間は、Critical状態でも全ての割り込みが行われる。
ダイアログが閉じられた後は、再び割り込み禁止状態になる。

Critical状態はスレッドごとに保持される。
現在のスレッドがCritical状態のまま終わったとき、現在のスレッドに割り込まれて停止していたスレッドはCriticalでない状態で続行される。

Criticalが実行された時点で、そのスレッドのSetBatchLines設定は「-1」になる

AutoExecuteセクションがCritical状態のまま終了した場合、そのスクリプトでは全てのスレッドがCritical状態で開始されるようになる。

Related

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

Examples

#space::  ; Win+Space hotkey.
Critical
ToolTip No new threads will launch until after this ToolTip disappears.
Sleep 3000
ToolTip  ; Turn off the tip.
return