現在のスレッドへの割り込みを禁止する
Critical[,MessageCheckInterval] Critical,Off Critical
引数名 | 説明 |
---|---|
MessageCheckInterval |
Critical状態の間のウィンドウメッセージのチェック間隔をミリ秒で指定する。 デフォルトは16ミリ秒。 非Critical状態では、5ミリ秒間隔でチェックされる。 大きな値を指定して、メッセージのチェックを行われないようにしても、実行速度はごくわずかしか向上しない。 |
Off | 第1引数に「Off」を指定すると、Critical状態を解除し、割り込みを受け付けるようにする |
スレッドの優先順位による割り込み防止と違い、スレッドが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状態で開始されるようになる。
Thread (command), Threads, #MaxThreadsPerHotkey, #MaxThreadsBuffer, OnMessage, RegisterCallback(), Hotkey, Menu, SetTimer
#space:: ; Win+Space hotkey. Critical ToolTip No new threads will launch until after this ToolTip disappears. Sleep 3000 ToolTip ; Turn off the tip. return