用定时器代替循环的例子 By FeiYue

热键使用普通循环容易卡顿失效,而改为定时器循环则不会。

↓↓↓↓↓↓↓↓以下是使用定时器的一个例子源码↓↓↓↓↓↓↓↓

;---------------------------------------
;  用定时器代替循环的例子  By FeiYue
;
;  说明:热键使用普通循环容易卡顿失效,而改为定时器循环则不会
;---------------------------------------

定时器执行(myfunc="", ByRef arg1="", args*)
{
  static last:="", timer:=[]
  Critical
  if (i:=InStr(arg1, "^_^"))
  {
    if GetKeyState(SubStr(arg1,1,i-1), "P")
    {
      Critical, Off
      return arg1:=SubStr(arg1, i+3)
    }
    last:=""
    SetTimer,, Off
    Exit
  }
  if (key:=LTrim(A_ThisHotkey, "~$*!^+#<>"))=""
    Exit
  s:=key "^_^" myfunc "@" arg1
  For i,v in args
    s.="@" v
  if (s=last)
    Exit
  For i,v in timer
    SetTimer, % v, Off
  if !(v:=timer[last:=s])
    timer[s]:=v:=Func(myfunc).Bind(key "^_^" arg1, args*)
  SetTimer, % v, 1
  Exit
}


F1:: Reload  ;-- 重启

F2:: Suspend  ;-- 暂停热键

$1:: 函数1("a")  ;-- 初始的 Loop 循环函数
$2:: 函数1("b")  ;-- 初始的 Loop 循环函数

$3:: 函数2("c")  ;-- 修改后的 定时器 循环函数
$4:: 函数2("d")  ;-- 修改后的 定时器 循环函数

函数1(k, k1="", k2="", k3="")
{
  key:=LTrim(A_ThisHotkey, "~$*!^+#<>")
  While GetKeyState(key, "P")
  {
    Send % k
    Sleep, 30
  }
}

函数2(k, k1="", k2="", k3="")
{
  定时器执行(A_ThisFunc, k, k1, k2, k3)
  Send % k
  Sleep, 30
}

给TA捐赠
共{{data.count}}人
人已捐赠
教程

简单、高效、实用的图片操作库 —— ImagePut 轻松实现截图、转换、缩放、裁剪等各种功能

2021-10-12 11:00:06

其他应用

多线程显示血量-萌新2号

2021-10-19 15:06:55

7 条回复 A文章作者 M管理员
  1. AHK中文社区

    飞跃老哥的代码值得研究!

  2. 水龍敬

    研究研究

  3. 孤独求败

    居然看不懂

  4. netcy

    积分不够,评论来凑

  5. 墙左墙右

    好巧,我也看不懂

  6. Enigma

    飞跃大佬, 能不能把帮助里的Settimer 示例 三击. 多击的示例. 做成通用的函数?

个人中心
购物车
优惠劵
有新私信 私信列表
搜索