Shaheer Rizwan Ответов: 2

Как запрограммировать таймер обратного отсчета в VB.NET


Вот как выглядит моя форма: https://pasteboard.co/JjermF5.png[^]

Проблема, с которой я сталкиваюсь с моим кодом, заключается в том, что когда я устанавливаю значения с помощью NumericUpandDown, он не отражает и не запускает таймер, когда я устанавливаю время и нажимаю кнопку Пуск, а также не позволяет мне не добавлять значение в поле minute NumericUpandDown.

Я не могу определить ошибку, может ли кто-нибудь помочь
Код приведен ниже:

Что я уже пробовал:

Public Class btnStandardSet
    Dim temp As Long
    Private Sub btnStandardSet_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        SetDefaults()
    End Sub

    Private Sub SetDefaults()
        timerStandard.Enabled = False
        btnSPCStandard.Enabled = False
        btnStopStandard.Enabled = False
        btnSetStandard.Enabled = True
        cmbStandardHour.Enabled = True
        cmbStandardSec.Enabled = True
        lblStandardHourValue.Text = "00"
        lblStandardMinValue.Text = "00"
        lblStandardSecValue.Text = "00"
        temp = 0
    End Sub

    Private Sub SetTime()
        lblStandardHourValue.Text = temp / 3600
        lblStandardMinValue.Text = (temp Mod 3600) / 60
        lblStandardSecValue.Text = temp Mod 3600 Mod 60
        If lblStandardHourValue.Text = 1 Then
            lblStandardHourValue.Text = "0" & lblStandardHourValue.Text
        End If
        If lblStandardMinValue.Text = 1 Then
            lblStandardMinValue.Text = "0" & lblStandardMinValue.Text
        End If
        If lblStandardSecValue.Text = 1 Then
            cmbStandardSec.Text = "0" & cmbStandardSec.Text
        End If
    End Sub

    Private Sub btnSetStandard_Click(sender As Object, e As EventArgs) Handles btnSetStandard.Click
        If cmbStandardMin.Value = "0" Then
            MsgBox("Please set a valid duration1")
        Else
            temp = cmbStandardHour.Value * 3600 + cmbStandardMin.Value * 60 + cmbStandardSec.Value
            cmbStandardHour.Enabled = False
            cmbStandardMin.Enabled = False
            cmbStandardSec.Enabled = False
            btnSetStandard.Enabled = False
            btnSPCStandard.Enabled = True
        End If
    End Sub

    Private Sub timerStandard_Tick(sender As Object, e As EventArgs) Handles timerStandard.Tick
        If temp = 0 Then
            MsgBox("Time is Over")
        Else
            temp = -1
            SetTime()
        End If
    End Sub

    Private Sub btnSPCStandard_Click(sender As Object, e As EventArgs) Handles btnSPCStandard.Click
        If btnSPCStandard.Text = "Start" Then
            SetDefaults()
            timerStandard.Enabled = True
            btnSPCStandard.Text = "Pause"
            btnStopStandard.Enabled = True
        ElseIf btnSPCStandard.Text = "Pause" Then
            timerStandard.Enabled = False
            btnSPCStandard.Text = "Stop"
        ElseIf btnSPCStandard.Text = "Continue" Then
            btnSPCStandard.Text = "Pause"
            timerStandard.Enabled = True
        End If
    End Sub

    Private Sub btnStopStandard_Click(sender As Object, e As EventArgs) Handles btnStopStandard.Click
        SetDefaults()
    End Sub
End Class

2 Ответов

Рейтинг:
1

OriginalGriff

Посмотрите на свой код:

Private Sub timerStandard_Tick(sender As Object, e As EventArgs) Handles timerStandard.Tick
    If temp = 0 Then
        MsgBox("Time is Over")
    Else
        temp = -1
        SetTime()
    End If
End Sub

Private Sub SetTime()
    lblStandardHourValue.Text = temp / 3600
    lblStandardMinValue.Text = (temp Mod 3600) / 60
    lblStandardSecValue.Text = temp Mod 3600 Mod 60
    If lblStandardHourValue.Text = 1 Then
        lblStandardHourValue.Text = "0" & lblStandardHourValue.Text
    End If
    If lblStandardMinValue.Text = 1 Then
        lblStandardMinValue.Text = "0" & lblStandardMinValue.Text
    End If
    If lblStandardSecValue.Text = 1 Then
        cmbStandardSec.Text = "0" & cmbStandardSec.Text
    End If
End Sub

SetTime изменяет отображение с temp - но ваш ТИК событие всегда устанавливает temp до -1. Таким образом, отображаемое значение будет всегда ... хм... мусор.

Чтобы сделать таймер обратного отсчета, самый простой способ-это:
Установите таймер с интервалом в полсекунды. Запустить его.
Установите значение DateTime: вызовите его expires и установите его на DateTime.MinValue.
В вашем тиковом событии проверьте, если expires равняется DateTime.MinValue.
Если это так, ничего не делайте.
Если нет, то сверьте его с датой и временем.
Если он больше, используйте свой SetTime метод (модифицированный) для отображения разницы (подсказка: вы можете вычесть два DateTime значения, чтобы дать вам Timespan что дает вам часы, минуты и секунды)
Если он меньше, то таймер истек, так что установите expires вернуться к DateTime.MinValue.

Запуск и остановка работы для вас приложения состоят из установки значения expires: DateTime.MinValue остановить его,
DateTime.Now.AddMinutes(30) ждать полчаса.

Попробуйте: это намного проще, чем кажется!


Рейтинг:
1

Ralf Meier

Я не уверен, что temp содержит допустимое значение - в этот момент вы должны что-то сделать. Кроме того, я не вижу, как temp получает его значение.
Но... здесь вы должны что - то изменить :

Private Sub timerStandard_Tick(sender As Object, e As EventArgs) Handles timerStandard.Tick
    If temp <= 0 Then   // <----- compare not only to 0
        MsgBox("Time is Over")
    Else
        temp -= 1   //  <----- decrease the value from temp (not set it to -1)
        SetTime()
    End If
End Sub