定时器不一致

时间:2014-12-07 02:46:56

标签: vb.net timer countdown

感谢您抽出宝贵时间阅读本文:

我正在处理一个涉及我们学校钟声倒计时的申请。我添加了一个计时功能,可以将可疑差异(1分44秒)添加到系统时间,以获得上学时间。

由于一些奇怪的原因,起初,计时器接近铃声(正负50毫秒)(在学校时间下午2:55,实时时间2:53:17),但是一旦我删除了50毫秒,第二天早上时间差了近5秒钟(铃声比程序晚5秒钟响了),所以我加了5秒钟,下午继续关闭5秒,所以我把它放回去了到104秒(1分44秒),我们还没有测试过。

我有些人似乎认为我的程序有问题,因为代码与我设置的原始差异没有任何变化。我已经在VB.Net中清理了解决方案,并再次构建它(使用清洁解决方案和菜单栏中的构建选项)。

就我个人而言,我相信因为我们的学校计时器是相当旧的系统(20多年),或许它每天的速度超过X秒,或者学校的钟声还有其他不一致的地方,而不是我的自己的计划。我可能会提醒你,学校时间提前1分44秒。所以当学校时间下午2:55:00时,实时是下午2:53:17。

如果某人比我更有经验,或者可能有更好的解决方案的人可以查看我正在粘贴的代码(在底部),并提供有关该问题的一些反馈,那将非常感激。

整个计时器在一个Functions_CalibrateTime()Public Shared Sub中运行,每10毫秒运行一次(不要问为什么,这有逻辑原因)。倒数计时器仅在上午7:00到上午11:59之间运行AM,并且铃声在AM上午8:45(学校时间)响铃,PM倒计时在下午12:00到下午2:55之间运行。我道歉..这是一段相当长的代码:

    'Announcement API: Calibrate Time
Public Shared Sub Functions_CalibrateTime()
    AVC.SYS_ANN_CurrentSchoolTime = AVC.SYS_GEN_SystemTime.AddSeconds(104)
    If Date.Now.Hour > 12 Then
        AVC.SYS_ANN_CurrentAnnouncePeriod = "PM"
    ElseIf Date.Now.Hour < 12 Then
        AVC.SYS_ANN_CurrentAnnouncePeriod = "AM"
    End If

    ' Gets (Real) Date and Time
    AVC.SYS_GEN_SystemTime = TimeOfDay
    AVC_Output.Label2.Text = AVC.SYS_ANN_TodaysDate.ToString("dddd") & ", " & AVC.SYS_ANN_TodaysDate.ToLongDateString
    AVC.SYS_GEN_Timers_CountDownFlashMode = False


    ' Countdown Clock
    Dim MorningAMTimeStart As Date = TimeValue("08:45:00")
    Dim MorningPMTimeFinish As Date = TimeValue("14:55:00")

    'AM: Only Starts clock at 7 O'Clock AM, and Ends at 12
    If AVC.SYS_ANN_CurrentSchoolTime.Hour >= 7 And AVC.SYS_ANN_CurrentSchoolTime.Hour < 12 Then
        If AVC.SYS_ANN_CurrentSchoolTime.Hour <= 8 And AVC.SYS_ANN_CurrentSchoolTime.Minute < 45 Then
            AVC_Dashboard.Timer3.Enabled = True
            AVC.SYS_GEN_Timers_CountDownValue = DateDiff(DateInterval.Second, AVC.SYS_ANN_CurrentSchoolTime, MorningAMTimeStart)
            AVC.SYS_GEN_Timers_CountDownValue += 1
            Dim iSpan As TimeSpan = TimeSpan.FromSeconds(AVC.SYS_GEN_Timers_CountDownValue)
            AVC.SYS_GEN_Timers_CountDownText = iSpan.Hours.ToString.PadLeft(2, "0"c) & ":" & iSpan.Minutes.ToString.PadLeft(2, "0"c) & ":" & iSpan.Seconds.ToString.PadLeft(2, "0"c)
        Else
            AVC.SYS_GEN_Timers_CountDownFlashMode = False
            AVC.SYS_GEN_Timers_CountDownText = " Offline"
        End If
    Else
        If AVC.SYS_ANN_CurrentAnnouncePeriod = "AM" Then
            AVC.SYS_GEN_Timers_CountDownFlashMode = False
            AVC.SYS_GEN_Timers_CountDownText = " Offline"
        End If
    End If


        'PM: Only Starts at 12:55 PM, and Ends Counter at 2:55 PM
    If AVC.SYS_ANN_CurrentSchoolTime.Hour >= 12 And AVC.SYS_ANN_CurrentSchoolTime.Hour <= 14 Then
        If AVC.SYS_ANN_CurrentSchoolTime.Hour <= 14 And AVC.SYS_ANN_CurrentSchoolTime.Minute < 55 Then
            AVC_Dashboard.Timer3.Enabled = True
            AVC.SYS_GEN_Timers_CountDownValue = DateDiff(DateInterval.Second, AVC.SYS_ANN_CurrentSchoolTime, MorningPMTimeFinish)
            Dim iSpan As TimeSpan = TimeSpan.FromSeconds(AVC.SYS_GEN_Timers_CountDownValue)
            AVC.SYS_GEN_Timers_CountDownText = iSpan.Hours.ToString.PadLeft(2, "0"c) & ":" & iSpan.Minutes.ToString.PadLeft(2, "0"c) & ":" & iSpan.Seconds.ToString.PadLeft(2, "0"c)
        Else
            AVC.SYS_GEN_Timers_CountDownFlashMode = False
            AVC.SYS_GEN_Timers_CountDownText = " Offline"
        End If
    Else
        If AVC.SYS_ANN_CurrentAnnouncePeriod = "PM" Then
            AVC.SYS_GEN_Timers_CountDownFlashMode = False
            AVC.SYS_GEN_Timers_CountDownText = " Offline"
        End If
    End If



        'PM: Timer Flashing System
        If AVC.SYS_GEN_Timers_CountDownValue < 60 Then
        AVC_Output.lbl_Output_CountDownTime.ForeColor = Color.Orange
        AVC_Output.pnl_CountDown_Flash.BackColor = Color.Orange
            AVC.SYS_GEN_Timers_CountDownFlashMode = False
            If AVC.SYS_GEN_Timers_CountDownValue <= 30 Then
                AVC_Output.lbl_Output_CountDownTime.ForeColor = Color.Red
                AVC_Output.pnl_CountDown_Flash.BackColor = Color.Red
                If AVC.SYS_GEN_Timers_CountDownValue <= 10 Then
                    AVC.SYS_GEN_Timers_CountDownFlashMode = True
                If AVC.SYS_GEN_Timers_CountDownValue = 0 Then
                    AVC_Output.pnl_CountDown_Flash.Visible = True
                    AVC.SYS_GEN_Timers_CountDownFlashMode = False
                    AVC_Dashboard.Timer3.Enabled = False
                    AVC_Output.pnl_CountDown_Flash.BackColor = Color.FromArgb(43, 43, 43)
                    AVC_Output.lbl_Output_CountDownTime.ForeColor = Color.White
                End If
                End If
            End If
        End If

再一次,抱歉所有的文字和一切,我想尽可能彻底地解释。如果您需要进一步解释,我将非常乐意更详细地解释或简化。

最后,感谢你们所做的一切,祝你们度过愉快的一天!

0 个答案:

没有答案