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

评论(0)