我有一个子例程,该子例程被调用到正在播放的曲目的节拍上以触发DMX照明。因此,该例程不会被Timer事件调用,并且该调用可能会随着轨道节奏而增加或减少。 我想做的是从自身内部以两倍于当前频率的频率调用相同的子例程。 我无法更改发送呼叫,因为这是我无法控制的设备发送的。 我的想法可能是获得最近2拍的时间,将其除以2,然后再次调用相同的子。显然,我将不得不防止分裂发生多次。
这是我想出的,但我明白了 mscorlib.dll中未处理System.StackOverflowException InnerException:无法计算表达式。
在“ If DateTime.Now + interval> = DateTime.Now然后”行上
Private Sub do_pan_robo_colors()
Dim ts As TimeSpan = Now.Subtract(last_beat_time)
If Not ts.TotalSeconds > 10 Then 'prevent overflow
Dim time_between_beats As Double = ts.TotalMilliseconds
Dim half_between_beats As Double = time_between_beats / 2
Dim interval As TimeSpan = TimeSpan.FromMilliseconds(half_between_beats)
If DateTime.Now + interval >= DateTime.Now Then
do_pan_robo_colors()
End If
End If
last_beat_time = DateTime.Now
'trigger DMX lamp
End Sub
答案 0 :(得分:0)
想出了解决方案
Private Sub do_pan_robo_colors(ByVal hardware_beat As Boolean)
If hardware_beat = True Then
Dim ts As TimeSpan = Now.Subtract(last_beat_time)
If Not ts.TotalSeconds > 10 Then 'prevent overflow
Timer_half_beat.Interval = ts.TotalMilliseconds / 2
Timer_half_beat.Start()
End If
last_beat_time = Now
End If
'Send DMX
并在计时器中
Private Sub Timer_half_beat_Tick(sender As System.Object, e As System.EventArgs) Handles Timer_half_beat.Tick
do_pan_robo_colors(False)
Timer_half_beat.Stop()
End Sub