线程

AutoHotKey

线程

最近事件调用的执行流被定义为 当前线程; 例子包括 热键, SetTimer 子程序, 自定义菜单项 以及 GUI 事件. 当前线程 可以在它自身子程序或由那个子程序调用其他子程序中执行命令.

尽管 AutoHotkey 实际并不支持多线程, 但它模拟了多线程的某些特性: 如果启动了第二个线程, 例如在前一个热键仍在执行时又按了另一个热键, 那么 当前线程 会被中断 (暂时停止) 来让新的线程成为 当前 线程. 如果在第二个线程还在运行时又启动了第三个线程, 那么第二个和第一个线程都会进入休眠状态, 依此类推.

当前线程 结束时, 最近中断的线程将恢复执行, 依此类推, 直到最后所有的线程都结束. 当线程被恢复时,它的设置例如 ErrorLevelSendMode 会自动恢复到中断前的状态;换句话说,中断不会给线程带来副作用(不过活动窗口可能会变化而产生影响).

注意: KeyHistory 命令/菜单项会显示处于中断状态的线程数量, 而 ListHotkeys 命令/菜单项则显示哪些热键拥有线程.

一个脚本可以同时含有多个 MsgBox, InputBox, FileSelectFileFileSelectFolder 对话框. 这是在前一个线程已经显示对话框后启动新线程 (通过 热键, 定时子程序, 自定义菜单项 等) 实现的.

默认情况下,子程序仍在运行的的热键热字串则不能再次启动.使用 #MaxThreadsPerHotkey 可以改变此特性.

线程优先级

优先级低于 当前线程 的任何线程 (热键, 定时子程序, 自定义菜单项 等) 不能中断当前线程. 在这种时候, 这样的计时器不会运行, 且用户试图创建线程 (例如按下 热键GUI 按钮) 会没有效果, 也不会被缓存起来. 由于这个原因, 通常在设计时最好让高优先级的线程快速结束, 或使用 Critical 而不将它们设置成高优先级.

默认的优先级为 0. 所有线程使用默认的优先级, 不过可以使用下列的其中一种方法改变:
1) 通过 SetTimer 给定时子程序指定优先级.
2) 通过 Hotkey 命令给热键指定优先级.
3) 热字串 在定义时或通过 #Hotstring 可以指定优先级.
4) 通过 Menu 命令给自定义菜单项指定优先级.
5) 使用 <a10>Thread</a10> 命令给 <e11>当前线程</e11> 设置自己的优先级.

不论当前线程的优先级如何,OnExit子程序(如果有)被调用时总是会运行.