VB.NET2010中的倒计时?

VB.NET2010中的倒计时?,vb.net,timer,countdowntimer,Vb.net,Timer,Countdowntimer,我正在尝试使用计时器从我选择的指定时间倒计时,时间使用格式MM:SS分为分钟和秒,然后在时间达到00:00时停止 到目前为止,我已经使用了之前在这里找到的答案,并根据我所知对其进行了修改,以进行倒计时,尽管我遇到了一个障碍,当计时器成功开始倒计时时,它会延迟并且在倒计时时不同步 例如,从120秒开始倒计时 02:00> 02:59> 02:58> 02:57> 02:56> 02:55 然后在同一测试下继续倒计时超过90秒 02:30> 01:29> 01:28> 01:27> 01:26> 0

我正在尝试使用计时器从我选择的指定时间倒计时,时间使用格式MM:SS分为分钟和秒,然后在时间达到00:00时停止

到目前为止,我已经使用了之前在这里找到的答案,并根据我所知对其进行了修改,以进行倒计时,尽管我遇到了一个障碍,当计时器成功开始倒计时时,它会延迟并且在倒计时时不同步

例如,从120秒开始倒计时

02:00
>
02:59
>
02:58
>
02:57
>
02:56
>
02:55

然后在同一测试下继续倒计时超过90秒

02:30
>
01:29
>
01:28
>
01:27
>
01:26
>
01:25

当倒计时达到0030秒时,它会错误地显示剩余的分钟数,并且无法理解或想出如何解决它

这是我的计数计时器代码

Private Sub tmrCountdown_Tick(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) _
                          Handles tmrCountdown.Tick

    SetTime = SetTime - 1
    lblTime.Text = FormatTime(SetTime)

    If SetTime = 0 Then
        tmrCountdown.Enabled = False
    End If

End Sub
这是我的时间格式化函数代码

Public Function FormatTime(ByVal Time As Integer) As String
    Dim Min As Integer
    Dim Sec As Integer

    'Minutes
    Min = ((Time - Sec) / 60) Mod 60

    'Seconds
    Sec = Time Mod 60

    Return Format(Min, "00") & ":" & Format(Sec, "00")

End Function
这是我的表单加载代码

Private Sub frmSinglePlayer_Load(ByVal sender As System.Object, _
                                 ByVal e As System.EventArgs) _
                             Handles MyBase.Load

    'Setting the time.
    SetTime = 120
    lblTime.Text = FormatTime(SetTime)
    tmrCountdown.Enabled = True

End Sub
我已经准备好了

    Dim SetTime As Integer
在我的公共类的顶部,这样我就可以在倒计时中输入指定的时间。这可能是一件非常愚蠢的事情,我不知道这是什么

非常感谢您的帮助,请记住,我是一名编程初学者,很容易被大量代码所迷惑。(我几乎无法理解它的功能。)


谢谢你的帮助

取一个倒计时计时器的测试样本。进行所需的更改(例如时间格式)

次新

玩这个:

Public Class frmSinglePlayer

    Private TargetDT As DateTime
    Private CountDownFrom As TimeSpan = TimeSpan.FromMinutes(3)

    Private Sub frmSinglePlayer_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        tmrCountdown.Interval = 500
        TargetDT = DateTime.Now.Add(CountDownFrom)
        tmrCountdown.Start()
    End Sub

    Private Sub tmrCountdown_Tick(sender As Object, e As System.EventArgs) Handles tmrCountdown.Tick
        Dim ts As TimeSpan = TargetDT.Subtract(DateTime.Now)
        If ts.TotalMilliseconds > 0 Then
            lblTime.Text = ts.ToString("mm\:ss")
        Else
            lblTime.Text = "00:00"
            tmrCountdown.Stop()
            MessageBox.Show("Done")
        End If
    End Sub

End Class
试试这个

'the amount of time to countdown from
Dim countDownFrom As New TimeSpan(0, 0, 10) 'ten seconds
'a Stopwatch to track how long running
Dim stpw As New Stopwatch

Private Sub Button1_Click(sender As Object, _
                          e As EventArgs) Handles Button1.Click
    Timer1.Interval = 250 'how often to update display
    Timer1.Start() 'start the display updater
    stpw.Reset() 'restart the stopwatch
    stpw.Start()
    'or depending on version of .Net
    'stpw.Restart
End Sub

Private Sub Timer1_Tick(sender As Object, _
                        e As EventArgs) Handles Timer1.Tick
    If stpw.Elapsed <= countDownFrom Then
        Dim toGo As TimeSpan = countDownFrom - stpw.Elapsed
        lblTime.Text = String.Format("{0:00}:{1:00}:{2:00}", toGo.Hours, toGo.Minutes, toGo.Seconds)
    Else
        Timer1.Stop()
        stpw.Stop()
    End If
End Sub
'从开始倒计时的时间量
从新时间跨度(0,0,10)'10秒开始变暗倒计时
“一块秒表,用来记录你跑了多长时间
调暗stpw作为新秒表
专用子按钮1\u单击(发件人作为对象_
e作为事件参数)处理按钮1。单击
Timer1.Interval=250'更新显示的频率
Timer1.Start()'启动显示更新程序
stpw.Reset()'重新启动秒表
stpw.Start()
'或取决于.Net的版本
'stpw.Restart
端接头
专用子计时器1_刻度(发送方作为对象_
e作为EventArgs)处理计时器1。勾选

如果stpw.appead您在原始代码中的错误是您错误地使用了MOD运算符

   'Minutes
    Min = ((Time - Sec) / 60) Mod 60

    'Seconds
    Sec = Time Mod 60
在2:00你会看到2:00,因为:

Min = ((120-00) / 60 ) MOD 60 = 2 MOD 60 = 2

Sec = 120 MOD 60 = 0
在1:59你看到2:59因为

Min = (119 / 60) MOD 60 = 1.98 MOD 60 = 1.98 = 2

Sec = 119 MOD 60 = 59
31秒后,你的分钟数从2变为1,因为

Min = (89 / 60) MOD 60 = 1.48 MOD 60 = 1.48 = 1
更简单地说:

Format((Math.Floor(lSeconds / 60)), "00") & ":" & Format((lSeconds Mod 60), "00")

您假设计时器滴答声正好发生在指定的时间间隔上。没有。我想如果你搜索倒计时计时器和VisualBasic,你会找到很多解决方案。我已经使用不同的时间量进行了测试,所有测试都在我指定的时间间隔内进行。当秒从00滴答到59时,分钟不会减少1,当秒从30滴答到29时,分钟会减少1。刚刚测试了这个倒计时计时器,它真是太棒了!工作起来很有魅力,没有任何麻烦。不幸的是,我用这个方法犯了更多的错误,尽管我确实有一个很好的破解方法,并尽我最大的努力修改它以使其工作。不过,谢谢你的帮助,这让我更好地了解了它的工作原理DIf
dtTimer.Interval=100
?提到用户必须导入系统,您没有包括秒表类型的示例。Diagnotics@htm11h-除非用户更改了默认系统。不需要显式导入诊断。顺便说一句,这已经有一年多的历史了。请不要只发布代码作为答案,还要解释你的代码的作用以及它是如何解决问题的。带有解释的答案通常更有帮助,质量更好,更容易吸引选票
Format((Math.Floor(lSeconds / 60)), "00") & ":" & Format((lSeconds Mod 60), "00")
Public SetTime As Integer = 0
Public Min As Integer = 0
Public Sec As Integer = 0
Public Decimaal As Decimal = 0

Public Function FormatTime(ByVal Time As Integer) As String   
  'Minutes
  Min = Fix(SetTime / 60000)
  'Decimaal
  Decimaal = (SetTime / 60000) - Min
  'Seconden
  Sec = Fix(Decimaal * 60)

  Return Format(Min, "00") & ":" & Format(Sec, "00")

End Function

Private Sub tmrCountdown_Tick(sender As Object, e As EventArgs) Handles tmrCountdown.Tick
        SetTime = SetTime - 1000
        lblCountdown.Text = FormatTime(SetTime)
        tmrCountdown.Enabled = True

        If SetTime = 0 Then
            tmrCountdown.Enabled = False
        End If
End Sub