新手最需要明白:
AHK的执行流程是基于伪多线程的,后面启动的线程会中断前面正在执行的线程。
首先,脚本启动时有个默认线程:是从第一行往下执行直到return或第一个热键之前。
其他的线程由以下方式启动:
1、热键、热字串;
2、settimer定时器;
3、gui窗口的控件g标签、gui窗口的特定消息标签(guiclose等);
4、菜单项对应的标签;
5、剪贴板变动标签、程序退出标签onexit;
6、自定义onmessage(消息)后,收到其他程序或系统发给ahk的消息。

对于高级用户而言,还有两个触发非常规线程的方式:函数的static变量初始化,类的实例的清空。

class aa {
 __Delete() {
   Gosub cc
 }
}

b:=new aa, b:=""
return

cc:
msgbox ok
return

 

递归循环和异步执行、异步监控变量变化.ahk

; 异步只是一种物尽其用的优化方法而已,不是必要项
; 以下都是用异步执行来防止线程阻塞的示例方法
;==================== 递归+异步执行 ====================
SetBatchLines -1

SetTimer 异步执行, -1
; 下面这个Loop循环会阻塞线程,但异步执行仍然可以工作
Loop {
  Sleep 10
  ToolTip 主线程持续运算演示-%A_Index%
} Return

异步执行:
Run Notepad,, Min, PID

; 这步等效于 WinWait 【等待直到指定的窗口存在】
异步执行2:
if WinExist("ahk_pid " PID)
  Goto 异步执行3
SetTimer 异步执行2, -10
Return

; 这步等效于 Sleep 3000 【延时3秒】,后台往记事本里写入"Sleep 3000 WinActivate",并在3秒后激活记事本窗口
异步执行3:
ControlSend, Edit1, "Sleep 3000 WinActivate", ahk_pid %PID%
SetTimer 异步执行4, -3000
Return

异步执行4:
WinActivate, ahk_pid %PID%
Return

;==================== 异步监控变量变化 ====================
/*
SetBatchLines -1

a := 1 , b := a
SetTimer 异步监控变量变化, 1
Loop {
  Sleep 10
  ToolTip, 主线程持续运算演示-%A_Index%
} return

异步监控变量变化:
if (a!=b) {
  SoundPlay *-1 ; 以系统提示音为提示变量以变化
  b := a
  ; SetTimer 异步监控变量变化, off
} return

F1::a := 2

F2::a := 3
*/

;==================== 递归循环计数后中止计时【60次】====================
/*
SetBatchLines -1

a=1
SetTimer 递归循环, 100
Loop {
  Sleep 100
  MouseGetPos, x, y
  ToolTip, 主线程持续运算演示-%A_Index%, x+10, y-80
} Return

递归循环:
ToolTip % "递归调用异步执行-" a++
if (a= 60)
  SetTimer 递归循环, off
Return
*/

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。