【问题标题】:Multiple loops with timers带计时器的多个循环
【发布时间】:2020-10-25 23:48:46
【问题描述】:

所以我是 AutoHotkey 的新手,我在 Multiloop timer 方面遇到了一些问题,它像第一个一样工作正常,但在第二个循环中,时间与我想要的不匹配。

所以基本上我希望循环运行 5 分钟 loopTwo 应该是 7 秒后的第一个,然后 2 秒后我希望在 loopOne 中调用 loopOne 我在按下之间有 1.2 秒的延迟,第一次工作正常,但随后时代开始转变,一切都变得一团糟

F1::
If (loopOne = True) 
{
    SetTimer loopTwo, Off
    TwoSwitch  := False
    SetTimer loopOne, Off
    OneSwitch := False
} else {
    TheTwoTime := 0
    SetTimer loopTwo, 7000 ;run every 7s
    TwoSwitch := True
    TheOneTime := 0
    SetTimer loopOne, 9000 ;run every 9s
    OneSwitch := True
}
return


loopOne:
    Send, 1
    Sleep, 1200
    Send, 1
    TheOneTime ++
    If TheOneTime >= 300 ;run for 5 minutes
    {
        SetTimer loopOne, Off
        OneSwitch := False
    }
return

loopTwo:
    Send, 2
    Sleep, 2000
    TheTwoTime ++
    If TheOneTime >= 300 ;run for 5 minutes
    {
        SetTimer loopTwo, Off
        TwoSwitch := False
    }
return

【问题讨论】:

  • 澄清一下,您是说您的代码逻辑按预期运行,但是您在让循环的时间正确运行时遇到问题?
  • 是的,它第一次完全运行 loopTwo in 7s > loopOne in 9s (2s after the loopTwo) ,然后太循环变得奇怪开始来得太早并且混淆了,我想要的是7 秒 > 9 秒(第一次后 2 秒)> 7 秒 > 9 秒,就像重复 x 时间在这种情况下为 5 分钟
  • 所以你想让loopOne总是在loopTwo之后激活2s?另外,仅供参考,第一个循环运行 1200*300=360,000 毫秒 = 6 分钟,而第二个循环运行 2000*300= 600000 毫秒 = 10 分钟。如果你想让我解释为什么,lmk,这与脚本休眠时计数器无法递增的事实有关
  • 是的,这就是我想要的所以那里的睡眠是个问题
  • 如果您的预期结果是让两个循环都运行五分钟,那么可以。过去,当我遇到这样的问题时,我只会在主函数(即 loopOne 和 loopTwo)中使用 setTimer 函数来触发另一个函数(如 FlipOne 和 FlipTwo),从而导致主函数在正确的时间后返回。 (因为 setTimer 函数不会像 Sleep 那样停止程序)

标签: autohotkey


【解决方案1】:

我认为这就是你想要做的。假设我理解正确的话,我认为不需要两个计时器。

还放弃了旧标签并切换到SendInput,因为它是首选的更快、更可靠的发送模式。
除了使用toggle:=!toggle 切换之外,它应该是一个非常简单的脚本。如果您看不懂,可以查看我的一个旧答案here
还要注意在计时器中使用负数,这是一个非常有用的东西。

F1::
    if (toggle:=!toggle)
    {
        SetTimer, MyCoolLoop, 7000 ;7sec period
        SetTimer, StopLooping, -300000 ;negative period, run ONCE after 5mins
    }
    else
        SetTimer, MyCoolLoop, Off
return

MyCoolLoop()
{
    ;number 2 gets sent (every 7secs)
    ;2secs after this, number 1 gets sent
    ;1.2secs after this, number 1 gets sent again
    ;3.8secs after this, we start from the beginning
    SendInput, 2
    Sleep, 2000
    SendInput, 1
    Sleep, 1200
    SendInput, 1
}

StopLooping()
{
    SetTimer, MyCoolLoop, Off
}

【讨论】:

  • 我认为这是我的问题,感谢您的解释,我有疑问,如果我想发送 noghing,我需要 3.8 秒才能完成 7 秒,我只需要睡 3.8 秒即可?如果我想以 10 秒为例,我只需要睡 6.8 秒,对吗?
  • 我不确定我是否明白你在说什么,但听起来不对。你不应该添加任何额外的额外睡眠。
  • 我将尝试更好地解释,所以我想运行该循环 5 分钟,然后停止该部分,现在可以了,我需要每 7 秒运行一次 MyCoolLoop,现在它运行 3.2 秒它从一开始我认为我应该做的就是改变这种方式,也许是SetTimer, MyCoolLoop, 7000,然后在最后一次发送输入之后添加Sleep, 3800,我错了吗?
  • 您不需要添加任何额外的睡眠。 MyCoolLoop() 中的代码每 7 秒执行一次。您添加到最后的任何睡眠都没有用。我刚才提到的 3.8sec 只是表示经过 2000+1200 毫秒后,在 7 秒的时间里还有 3800 毫秒,直到代码再次执行。
  • 我明白我认为这是在思考我正在跌倒的逻辑,也许我错过了解释我想要存档的内容,但它已经接近了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
相关资源
最近更新 更多