新手最需要明白:
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)