【问题标题】:Timer Interval Overflow visual basic定时器间隔溢出视觉基础
【发布时间】:2014-12-22 12:06:06
【问题描述】:

我正在尝试使用Timer,效果很好我正在将它与其他变量一起使用

 Const daily As Integer = 86400000
 Const weekly As Integer = 604800000
 Const hour As Integer = 3600000

但使用每月变量Private monthly As Long 时出现溢出错误,这是我的代码

Private timepick As New DateTimePicker()
Private timeLeft As Long
Public trackTimer As Long
Private CloseAllowed As Boolean
Private time As ULong
Private progress As Long
Const daily As Integer = 86400000
Const weekly As Integer = 604800000
Const hour As Integer = 3600000
Private monthly As Long
Private currentDate As Date = DateTime.Now
Private controller As Boolean = False

Private Sub AutoShutDown_Tick(sender As Object, e As EventArgs) Handles AutoShutDown.Tick
    If (controller = False) Then
        AutoShutDown.Enabled = False
    Else
        CountDown.Enabled = True
        progress = 0
        WarningForm.Timer1.Enabled = True
        timeLeft = time
        trackTimer = timeLeft
        AutoShutDown.Interval = time 'Overflow 
        ProgressBar1.Maximum = timeLeft
    End If
    'System.Diagnostics.Process.Start("shutdown", "-s -t 00")
    MsgBox("Shuting down...")
End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    timepick.Format = DateTimePickerFormat.Time
    timepick.ShowUpDown = True
    timepick.Location = New Point(154, 12)
    timepick.Width = 123
    Me.Controls.Add(timepick)
    cmbAction.SelectedIndex = 0
    rdoOnce.Checked = True
    Dim days As Long = DateTime.DaysInMonth(currentDate.Year, currentDate.Month)
    monthly = (days * daily)
End Sub

我的Select Case的一部分

   Case "Monthly"
            Dim dueDate As Date = DateTime.Parse(currentDate.Month & "/" & cmbControl.Text & "/" & currentDate.Year & " " & timepick.Text)
            Dim dayOfTheMonth As Integer = ((dueDate.Day * 24 - currentDate.Hour) * hour) + (dueDate.Minute * 60000) + (dueDate.Hour * hour)
            Dim currentDayOfTheMon As Integer = ((currentDate.Day * 24 - currentDate.Hour) * hour) + (currentDate.Minute * 60000) + (currentDate.Hour * hour)
            If (dayOfTheMonth > currentDayOfTheMon) Then
                timeLeft = (dayOfTheMonth - currentDayOfTheMon)
            End If
            time = monthly
            controller = True
    End Select

    trackTimer = timeLeft
    ProgressBar1.Maximum = timeLeft
    AutoShutDown.Interval = timeLeft
    AutoShutDown.Enabled = True
    CountDown.Enabled = True

【问题讨论】:

    标签: vb.net vba timer


    【解决方案1】:

    但使用月变量时出现溢出错误

    这是一个很好的问题,它告诉你你的代码很糟糕。 Timer的Interval属性是一个Integer,单位是毫秒。一个月是 31 x 24 x 3600 x 1000 = 2,678,400,000 毫秒。这超过了 Integer.MaxValue,2,147,483,648。或者换句话说,您不能使用 Timer 以毫秒为单位计时超过 24 天。

    一个简单的解决方法是不要计时整个时间段,而是让您的计时器计时,例如每小时计时一次。实际间隔无关紧要,只需检查是否经过了足够的时间。大致:

    Private ShutdownDate As DateTime
    
    Private Sub StartShutdownTimer(ByVal interval As Long)
        ShutdownDate = DateTime.UtcNow.AddMilliseconds(interval)
        AutoShutDown.Enabled = True
    End Sub
    
    Private Sub AutoShutDown_Tick(sender As Object, e As EventArgs)
        If DateTime.UtcNow >= ShutdownDate Then
            AutoShutDown.Enabled = False
            '' etc...
        End If
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2013-04-02
      • 2014-08-21
      • 2012-12-22
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      相关资源
      最近更新 更多