Critical

防止当前线程被其他线程中断, 或开启可中断.

Critical , OnOffNumeric

参数

OnOffNumeric

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

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

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

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

关键线程的行为

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

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

Critical Off

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

Critical Off 会取消当前线程的不可中断性周期即使该线程是非关键线程, 因此会让像 GuiSize 这样的事件马上或不出意外的被处理.

线程设定

如何保存和还原当前线程的关键设定请看 A_IsCritical. Critical 是一个对于特定线程的设定, 当一个关键线程结束时, 随后/接续的线程(如果有的话) 会自动变成非关键线程. 因此没有必要在一个线程结束时马上使用 Critical Off.

如果在自动执行段没有使用 Critical(脚本开头部分), 所有的线程将会以非关键线程开始(但 Thread Interrupt 的设定仍然有效). 与之对比的是, 如果自动执行段打开了 Critical 但随后并没有关闭过它, 每个新启动的线程(像热键, 自定义菜单项目计时器子程序) 都会以关键线程开始.

Thread NoTimers 命令类似于 Critical, 但前者仅保护线程不被计时器中断.

[v1.0.47+]: 打开 Critical 的同时也会让 SetBatchLines -1当前线程生效.

消息检查间隔

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

此设置影响如下:

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

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

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

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

Thread(命令), 线程, #MaxThreadsPerHotkey, #MaxThreadsBuffer, OnMessage(), RegisterCallback(), Hotkey, Menu, SetTimer

示例

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

#space::  ; Win+Space 热键.
Critical
ToolTip No new threads will launch until after this ToolTip disappears.
Sleep 3000
ToolTip  ; 关闭提示.
return  ; 从热键子程序中返回, 结束当前线程. 随后的线程会按设置恢复为非关键的.