让第二个线程持续更新?

Getting a second thread to update consistently?

我正在尝试在 autohotkey 中创建一个 "heartbeat monitor" 类型。

我当前的程序很简单,我有一个大约需要 2 秒才能完成的过程来计算蜂鸣声应该有多尖锐,以及一个以计算出的频率发出蜂鸣声的小循环例程。

但我现在 运行 遇到了障碍 - 如何更新 "beeper" 例程以使用新频率而不中断其正常计时?

我最初尝试的是有效地检查全局变量(我觉得这不太可能奏效)

frequency := 500 ;super-global default frequency

Somehotkey::
SetTimer, BeepCycle, -1
Loop, 
{
   frequency := CalculateFrequency()
   Sleep, 5000
}
return

BeepCycle:
loop,
{
   SoundBeep, %frequency%
   Sleep, 500
}

但频率似乎永远不会更新(因为计算频率再也不会 运行s),这是有道理的。

所以我的下一个方法是改用 settimer 的计时,但它根本不够一致。

frequency := 500 ;super-global default frequency

Somehotkey::
SetTimer, BeepCycle, 500
Loop, 
{
   frequency := CalculateFrequency()
   Sleep, 5000
}
return

BeepCycle:
SoundBeep, %frequency%

允许更改频率同时保持 500 毫秒间隔一致的最佳方法是什么?我是 ahk 的多线程新手。

感谢 autohotkey 论坛上的 wolf_II - 这是我迄今为止找到的最佳解决方案。

使用两个计时器可以让他们更好地相处(并避免评论中的睡眠问题)

global frequency := 500 ; default frequency

Somehotkey::
SetTimer, BeepCycle, 500
SetTimer, CalcCycle, 5000
return

BeepCycle:
   SoundBeep, %frequency%
return


CalcCycle:
   frequency := CalculateFrequency()
return