从当前速率的一半内调用子例程

时间:2019-05-22 11:10:46

标签: .net vb.net stack-overflow subroutine timespan

我有一个子例程,该子例程被调用到正在播放的曲目的节拍上以触发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

1 个答案:

答案 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