线程


由最近的热键定时的子程序自定义的菜单项GUI 事件所调用的执行流被定义为当前线程当前线程可以是它自身子程序或由子程序调用的其它子程序中的执行命令。

尽管 AutoHotkey 没有真正地使用多线程,但却模拟了它的特性:如果启动了第二个线程,例如前一个热键仍在执行时又按了另一个热键,那么当前线程将被中断(暂时地停止)以允许新的线程变成当前的线程。如果在第二个线程还在运行时又启动了第三个线程,那么第二个和第一个线程都会进入休眠状态,以此类推。

当前线程结束时,最近中断的那个线程将被恢复,以此类推,直到所有线程最终结束。在线程被恢复时,它的设置比如 ErrorLevelSendMode 将自动恢复到中断前的状态;换句话说,线程不会受到中断的副作用(除了在激活的窗口中可能有改变 )。

注意: KeyHistory 命令或菜单项显示了有多少线程处于中断状态,ListHotkeys 命令或菜单项显示了哪些热键拥有线程。

一个脚本可以同时产生多个 MsgBox, InputBox, FileSelectFileFileSelectFolder 对话框。这是在先前的线程已经显示了一个对话框的情况下通过启用新线程来实现的(通过热键定时的子程序自定义的菜单项等等)。

默认情况下,如果一个给定的热键热字符串子程序已经运行,那么它不能再次运行。可用 #MaxThreadsPerHotkey 改变此特性。

线程优先级

当前线程优先级低的线程(热键定时的子程序自定义菜单项等等)不能中断它。在这个时候,那些定时器都不会运行,并且如果用户尝试创建线程(比如按下热键GUI 按钮)的话,将无任何反应也不会被缓存起来。由于这个原因,通常设计时最好让高优先级的线程尽快结束,或者使用 Critical 而不是将它们设置成高优先级。

默认优先级是 0。所有线程都使用默认优先级除非被下列方法之一所改变:
1) 通过 SetTimer 给一个定时的子程序指定优先级。
2) 通过 Hotkey 命令给一个热键指定优先级。
3) 在定义一个热字符串时指定优先级,或者通过 #Hotstring 指令。
4) 通过 Menu 命令给一个自定义菜单项指定优先级。
5) 通过 Thread 命令来设置当前线程自身的优先级。

不管当前线程的优先级高低,OnExit 子程序(如果有的话)在它被调用时将总能运行起来。

翻译: yugi   修正:天堂之门 menk33@163.com 2008年11月23日