用定时器代替循环的例子 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}}人
人已捐赠
其他

社区更新至3.2.4

2021-10-14 16:54:19

其他案例

YAML/JSON格式字符串序列化和反序列化-大白

2021-10-19 14:25:35

7 条回复 A文章作者 M管理员
  1. Enigma

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

  2. 墙左墙右

    好巧,我也看不懂

  3. netcy

    积分不够,评论来凑

  4. 孤独求败

    居然看不懂

  5. 水龍敬

    研究研究

  6. 河许人

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

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