Вызов подпрограммы изнутри на половину текущего тарифа - PullRequest
0 голосов
/ 22 мая 2019

У меня есть подпрограмма, которая вызывается в такт воспроизводимой дорожки для включения освещения DMX.Таким образом, процедура не вызывается событием Timer, и вызовы могут увеличиваться или уменьшаться с ритмом дорожек.То, что я хотел бы сделать, это вызвать одну и ту же подпрограмму изнутри самой себя с удвоенной частотой.Я не могу изменить отправляющий вызов, так как он отправляется с оборудования, которое я не контролирую.Возможно, мои мысли заключались в том, чтобы узнать время последних 2 ударов, разделить их на 2 и снова вызвать тот же саб.Очевидно, я должен был бы предотвратить повторение деления более одного раза.

Это то, что я придумал, но я получаю, что System.StackOverflowException не обработан, произошел в mscorlib.dll. InnerException: Невозможно оценить выражение.

в строке «Если DateTime.Now + интервал> = DateTime.Now Then "

 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 голосов
/ 22 мая 2019

Фигурное решение

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
...