Critical

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

Critical OnOffNumeric

参数

OnOffNumeric

类型: 字符串整数

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

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

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

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

返回值

类型: 整数

函数返回以前的设置(值 A_IsCritical 将在调用函数之前返回); 如果 Critical 为 Off, 则为 0, 否则为大于零的整数.

关键线程的行为

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 打开的状态下, 默认为 16 ms, 在 Critical 关闭状态下, 每 5 ms 检查一次. 延长时间间隔会推迟消息/事件的到达, 给出更多的时间让当前线程结束. 这会减少某些 OnMessage 回调GUI events 因为 "线程已运行" 而丢失的可能性. 然而, 像 SleepWinWait 这样的等待型函数则无视此设定而照常检查消息(一个解决办法是 DllCall("Sleep", "UInt", 500)).

此设置影响如下:

当脚本暂停或等待时, 它不会影响消息检查的频率.

因为系统滴答计数的间隔通常为 15.6 毫秒, 所以最小增量值通常至少为 15 或 16. 自上次检查以来的持续时间必须 超过 设置的间隔, 以便进行另一次检查. 例如, 设置为 16 要求滴答计数更改为 17 或更大. 由于消息检查可以在 15.6 毫秒窗口内的任何时间发生, 因此在 1 到 16 之间的任何设置都可以允许在单个间隔内进行两次消息检查.

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

Critical -1 开启 Critical, 但禁用消息检查. 这并不妨碍程序在执行睡眠, 延迟或等待时检查消息. 在分派消息可能会干扰当前执行的代码的情况下, 例如在 OnMessage 回调期间处理某些类型的消息时, 它非常有用.

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  ; 从热键子程序中返回. 根据定义, 要恢复的任何底层线程都是非关键的.
}