# Thread

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

    Thread, SubCommand , Value1, Value2

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

## 子命令

对于 SubCommand, 指定以下命令之一:

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

### NoTimers

防止被任何的计时器中断.

    Thread, NoTimers , TrueOrFalse

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

如果自动执行段(脚本的顶部) 没有使用这个子命令, 则所有线程初始都可以被计时器中断(然而下面的 Interrupt 子命令设置仍会生效). 相比之下, 如果在自动执行段中打开了这个子命令, 但却从没有关闭它, 则每个新启动的线程(例如 热键, 自定义菜单项或计时器) 初始都不会被计时器中断.

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

`Thread, NoTimers` 相当于 `Thread, NoTimers, true`. 此外, 当 TrueOrFalse 参数为表达式, 计算结果为真时表示为 1, 而为假时为 0.

### Priority

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

    Thread, Priority, Level

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

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

相关提示, 整个脚本的操作系统优先级可以这样改变 Process Priority. 例如:

    Process, Priority,, High

### Interrupt

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

    Thread, Interrupt , Duration, LineCount

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

默认情况下, 每个新运行的线程在开始的 15 毫秒的 持续时间 或在开始的 1000 个脚本 行数(无论首先遇到哪个) 执行时都是不可中断的. 这使得线程有机会结束, 而不是立即被另一个等待运行的线程中断(例如缓冲的热键或一系列即将运行的计时子程序).

注意: 任何小于 17 的 持续时间 可能导致实际持续时间缩短或直接中断, 因为系统刻度计数的最小分辨率为 10 到 16 毫秒.

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

这个子命令是全局的, 这意味着所有后续线程都会遵循它, 即使子命令在自动执行段之外的其他地方使用. 然而, 被中断过的线程则不受影响, 因为它们不可中断的时期已经期满(说明: Thread, Interrupt 仅设置新线程创建时不可中断的那个时期, 而被中断过的线程已经过了这个时期即随时都可能被中断, 所以不受此设置影响). 同样地, 当前线程只有在改变 LineCount 时是不可中断的, 它才会受影响, 因为此时新的 LineCount 将对其生效.

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

不论此子命令如何, 当一个线程显示 MsgBox, InputBox, FileSelectFile 或 FileSelectFolder 对话框时都将变成可中断的.

两个参数的其中每个都可以留空来保持此设置不变.

如果 Critical 被指定为线程的子程序或函数的第一行, 则线程将启动不可中断, 并且 Interrupt 子命令没有效果. 但是, 这并不适用于绑定函数或用户自定义的函数对象.

## 备注

由于更大的伸缩性和缓冲事件的能力, 命令 Critical 通常比 `Thread Interrupt` 和 `Thread Priority` 更有效.

## 相关

Critical, 线程, Hotkey, Menu, SetTimer, Process

## 示例

让当前线程的优先级比平均的稍高一点.

    Thread, Priority, 1

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

    Thread, Interrupt, 0

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

    Thread, Interrupt, 50, 2000

dftg