# Thread

设置线程的优先级或是否可以被中断. 它也可以临时禁用所有的计时器.

    Thread SubFunction , Value1, Value2

SubFunction, Value1 和 Value2 参数互相依赖, 其用法描述如下.

## 子函数

对于 SubFunction, 指定以下之一:

- NoTimers: 防止被任何的计时器中断.
- Priority: 更改当前线程的优先级级别.
- Interrupt: 更改新启动的线程的可中断时间.

### NoTimers

防止被任何计时器中断.

    Thread "NoTimers" , False

此子函数防止线程被任何计时器中断, 直至当前线程结束, 或执行 `Thread "NoTimers", false`, 或被另一个允许计时器的线程中断(这样的情况下, 计时器可以中断正在中断的线程直到计时器完成).

如果自动执行线程没有改变这个设置, 则所有线程均以可被计时器中断的方式启动(然而下面的 Interrupt 子函数设置仍会生效). 相比之下, 如果在自动执行线程中打开了这一设置, 但却从没有关闭它, 则每个新启动的线程(如 热键, 自定义菜单项或计时器) 均以不会被计时器中断的方式启动.

不论默认的设置如何, 当脚本没有其他线程时计时器总能执行(除非使用了 Pause).

`Thread "NoTimers"` 等同于 `Thread "NoTimers", true`. 此外, 由于 False 参数是一个表达式, 因此 true 解析为 1, 而 false 解析为 0. See Boolean Values for details.

### Priority

更改当前线程的优先级级别.

    Thread "Priority", Level

指定 Level 为介于 -2147483648 和 2147483647 之间的整数(或表达式) 来表示当前线程的新优先级. 这不会影响其他线程. 有关详情, 请参阅线程.

由于具有缓冲事件的能力, 函数 Critical 通常优于这个子函数.

相关提示, 整个脚本的操作系统优先级可以通过 ProcessSetPriority 来改变. 例如:

    ProcessSetPriority "High"

### Interrupt

更改新启动的线程的可中断时间.

    Thread "Interrupt" , Duration, LineCount

注意: 应该谨慎使用此子函数, 因为大多数脚本在接近默认设置的情况下执行更一致.

默认情况下, 每个新启动的线程在开始的 Duration(15 毫秒) 或 LineCount(1000 行) 中都是不中断的, 以先到者为准. 这使线程有机会完成操作, 而不是被正在等待启动的另一个线程立即中断(如, 缓冲的热键或计划运行的计时器子程序).

注意: 任何 Duration 小于 17 可能导致实际持续时间缩短或直接中断, 因为系统刻度计数的最小分辨率为 10 到 16 毫秒. 但是, 在线程中断之前, 将至少执行一行, 从而允许脚本在需要时启用 Critical.

如果任一参数为 0, 每个新启动的线程都可以被立即中断. 如果任一参数为 -1, 那么此参数会使得线程不会被中断. 这两个参数的最大值为 2147483647.

这个设置是全局的, 这意味着着它影响所有后续的线程, 即使此函数没有被自动执行线程调用. 然而, 已经被中断过的线程则不受影响, 因为它们不可中断的时间已经期满. 同样地, 当前线程不受影响, 除非在更改 LineCount 参数时当前线程是不中断的, 在这种情况下, 新的 LineCount 将对其生效.

如果在当前线程处于不可中断状态时, 按下了热键或选择了自定义菜单项, 那么这些事件会被缓冲起来. 换句话说, 到当前线程结束或变得可中断时(无论先遇到哪个) 它们才会运行. 例外情况是当当前线程在结束前变得可中断并且它的优先级高于被缓冲的事件, 此时被缓冲的事件将被取消缓冲并被丢弃.

不论此子函数如何, 当一个线程在显示 MsgBox, InputBox, FileSelect 或 DirSelect 对话框时都将变成可中断的.

任一参数都可以留空来保持此设置不变.

## 备注

由于更大的灵活性和缓冲事件的能力, 函数 Critical 通常比 `Thread "Interrupt"` 和 `Thread "Priority"` 更有效.

## 相关

Critical, 线程, Hotkey, Menu 对象, SetTimer, Process 函数

## 示例

使当前线程的优先级稍高于平均值.

    Thread "Priority", 1

让每个新启动的线程变成可立即中断的.

    Thread "Interrupt", 0

让每个线程在 50 ms 或 2000 行(无论先遇到哪个) 之后变成可中断.

    Thread "Interrupt", 50, 2000

dftg