Critical

防止当前线程被其他线程中断, 或使其能够被中断.

Critical OnOffNumeric

参数

OnOffNumeric

如果参数为空或省略, 默认为 On. 否则, 请指定以下之一:

On: 设置当前线程为关键的, 这意味着它不会被其他线程中断.

Off: 当前线程立即成为可中断的, 无论 Thread Interrupt 的设置如何. 有关详情, 请参阅 Critical Off.

(数字): 指定一个正数来打开 Critical, 但同时也会改变检查内部消息队列的时间间隔. 有关详情, 请参阅消息检查间隔. 指定 0 关闭 Critical.

关键线程的行为

Critical 线程是 不可中断的; 有关详情, 请参阅线程.

关键线程在显示 MsgBox 或其他对话框时, 会变成可中断的. 但是, 与 Thread Interrupt 不同, 在用户解除对话框后这个线程会再恢复为关键的.

Critical Off

当缓冲的事件等待启动新的线程时, 使用 Critical "Off" 不会导致立即中断当前线程, 而会经过平均 5ms 才发生中断. 这会导致在中断前有超过 99.999% 的可能执行了至少一行 Critical "Off" 后面的代码. 可通过使用像 Sleep -1WinWait 一个尚不存在的窗口这样的延迟手段立即产生强制中断.

Critical "Off" 会取消当前线程的不可中断性周期, 即使该线程不是关键线程, 因此会让像 Size 这样的事件更快或更可预测地被处理.

Thread 设置

如何保存和还原当前的 Critical 设置, 请参阅 A_IsCritical. 但是, 由于 Critical 是特定于线程的设置, 因此当关键线程结束时, 底层/恢复的线程(如果有的话) 将自动是非关键线程. 因此, 不需要在结束线程之前执行 Critical Off.

如果在自动执行线程中没有使用 Critical, 所有的线程将会以非关键线程启动(尽管 Thread "Interrupt" 的设置仍然有效). 相比之下, 如果自动执行线程打开了 Critical 但随后并没有关闭过它, 每个新启动的线程(如 热键, 自定义菜单项计时器子程序) 都会以关键线程方式启动.

函数 Thread "NoTimers" 类似于 Critical, 除了它仅阻止被计时器中断.

消息检查间隔

指定一个正数作为首个参数(例如 Critical 30) 将会打开 Critical, 但同时也会改变检查内部消息队列的时间间隔(以 ms 毫秒计). 如果未指定该参数, 在 Critical 打开的状态下, 每 16ms 检查一次消息队列, 在 Critical 关闭状态下, 每 5ms 检查一次. 延长时间间隔会推迟消息/事件的到达, 给出更多的时间让当前线程结束. 这会减少某些 OnMessage()GUI events 因为 "线程已运行" 而丢失的可能性. 然而, 像 SleepWinWait 这样的等待型函数则无视此设定而照常检查消息(一个解决办法是 DllCall("Sleep", "UInt", 500)).

注意: 将消息检查间隔设置的太大会减少对多种事件的响应能力, 例如 GUI 窗口的重绘.

Thread (函数), 线程, #MaxThreadsPerHotkey, #MaxThreadsBuffer, OnMessage, CallbackCreate, Hotkey, Menu 对象, SetTimer

示例

按下热键显示工具提示 3 秒. 由于 Critical, 在此期间启动的任何新线程(例如再次按下热键) 将被推迟, 直到工具提示消失.

#space::  ; Win+Space 热键.
{
    Critical
    ToolTip "No new threads will launch until after this ToolTip disappears."
    Sleep 3000
    ToolTip  ; 关闭提示.
    return  ; 从热键子程序中返回. 根据定义, 要恢复的任何底层线程都是非关键的.
}
unixetc