防止当前线程被其他线程中断, 或使其能够被中断.
Critical OnOffNumeric
如果参数为空或省略, 默认为 On. 否则, 请指定以下之一:
On: 设置当前线程为关键的, 这意味着它不会被其他线程中断.
Off: 当前线程立即成为可中断的, 无论 Thread Interrupt 的设置如何. 有关详情, 请参阅 Critical Off.
(数字): 指定一个正数来打开 Critical, 但同时也会改变检查内部消息队列的时间间隔. 有关详情, 请参阅消息检查间隔. 指定 0 关闭 Critical.
Critical 线程是 不可中断的; 有关详情, 请参阅线程.
关键线程在显示 MsgBox 或其他对话框时, 会变成可中断的. 但是, 与 Thread Interrupt 不同, 在用户解除对话框后这个线程会再恢复为关键的.
当缓冲的事件等待启动新的线程时, 使用 Critical "Off"
不会导致立即中断当前线程, 而会经过平均 5ms 才发生中断. 这会导致在中断前有超过 99.999% 的可能执行了至少一行 Critical "Off"
后面的代码. 可通过使用像 Sleep -1
或 WinWait 一个尚不存在的窗口这样的延迟手段立即产生强制中断.
Critical "Off"
会取消当前线程的不可中断性周期, 即使该线程不是关键线程, 因此会让像 Size 这样的事件更快或更可预测地被处理.
如何保存和还原当前的 Critical 设置, 请参阅 A_IsCritical. 但是, 由于 Critical 是特定于线程的设置, 因此当关键线程结束时, 底层/恢复的线程(如果有的话) 将自动是非关键线程. 因此, 不需要在结束线程之前执行 Critical Off
.
如果在自动执行线程中没有使用 Critical, 所有的线程将会以非关键线程启动(尽管 Thread "Interrupt"
的设置仍然有效). 相比之下, 如果自动执行线程打开了 Critical 但随后并没有关闭过它, 每个新启动的线程(如 热键, 自定义菜单项或计时器子程序) 都会以关键线程方式启动.
函数 Thread "NoTimers" 类似于 Critical, 除了它仅阻止被计时器中断.
指定一个正数作为首个参数(例如 Critical 30
) 将会打开 Critical, 但同时也会改变检查内部消息队列的时间间隔(以 ms 毫秒计). 如果未指定该参数, 在 Critical 打开的状态下, 每 16ms 检查一次消息队列, 在 Critical 关闭状态下, 每 5ms 检查一次. 延长时间间隔会推迟消息/事件的到达, 给出更多的时间让当前线程结束. 这会减少某些 OnMessage() 和 GUI events 因为 "线程已运行" 而丢失的可能性. 然而, 像 Sleep 和 WinWait 这样的等待型函数则无视此设定而照常检查消息(一个解决办法是 DllCall("Sleep", "UInt", 500)
).
注意: 将消息检查间隔设置的太大会减少对多种事件的响应能力, 例如 GUI 窗口的重绘.
Thread (函数), 线程, #MaxThreadsPerHotkey, #MaxThreadsBuffer, OnMessage, CallbackCreate, Hotkey, Menu 对象, SetTimer