制作简单准确的秒表的最佳方法。

问题描述 投票:0回答:2

我有一个项目,我必须做一个秒表。它可以工作,但与Windows定时器相比,它不准确。另外,我想知道是否有其他高效简单的方法,如果有,我可以怎么做?Timer的时间间隔是1。

这是我的代码。

    Dim min As Integer = 30
    Dim seg As Integer = 59
    Dim mseg As Integer = 99
    Private Sub tmTimer_Tick(sender As Object, e As EventArgs) Handles tmTimer.Tick

        If lblStopWatch.Text = "00:00:00" Then
            lblStopWatch.ForeColor = Color.DarkGray
            tmTimer.Enabled = False
            min = 30
            seg = 59
            mseg = 99
        Else
            mseg -= 1
            If mseg < 0 Then
                mseg = 99
                seg -= 1
                If seg < 0 Then
                    seg = 59
                    min -= 1
                End If
            End If

            If min < 10 And seg < 10 And mseg < 10 Then
                lblStopWatch.Text = "0" + min.ToString + ":0" + seg.ToString + ":0" + mseg.ToString
            ElseIf min < 10 And seg < 10 Then
                lblStopWatch.Text = "0" + min.ToString + ":0" + seg.ToString + ":" + mseg.ToString
            ElseIf min < 10 And mseg < 10 Then
                lblStopWatch.Text = "0" + min.ToString + ":" + seg.ToString + ":0" + mseg.ToString
            ElseIf seg < 10 And mseg < 10 Then
                lblStopWatch.Text = min.ToString + ":0" + seg.ToString + ":0" + mseg.ToString
            Else
                If mseg < 10 Then
                    lblStopWatch.Text = min.ToString + ":" + seg.ToString + ":0" + mseg.ToString
                ElseIf seg < 10 Then
                    lblStopWatch.Text = min.ToString + ":0" + seg.ToString + ":" + mseg.ToString
                ElseIf min < 10 Then
                    lblStopWatch.Text = "0" + min.ToString + ":" + seg.ToString + ":" + mseg.ToString
                Else
                    lblStopWatch.Text = min.ToString + ":" + seg.ToString + ":" + mseg.ToString
                End If
            End If
        End If
    End Sub

这是启动定时器的按钮。

Private Sub btnAcept_Click(sender As Object, e As EventArgs) Handles btnAcept.Click

     lblCronometro.ForeColor = Color.RoyalBlue
        lblCronometro.Text = "30:00:00"
        tmCronometro.Enabled = True
        tmCronometro.Start()

End Sub

如果这个例子是用C#或vb语言编写的,我可以同时得到这两种语言。 谢谢。

vb.net timer countdown countdowntimer
2个回答
0
投票

小贴士

如果你想自己做,而不是使用现有的 StopWatch 类,另一个选择是跟踪秒表开始的时间(start)和秒表的运行时间(elapsed).

随着 start 值,我们可以计算出 elapsed 计时器中的时间 Tick 这样的事件。

// elapsed is a TimeSpan object
elapsed = DateTime.Now - start;

如果我们添加了停止秒表然后再次启动的功能(不需要重新设置), 那么我们必须考虑到 "停机时间". 我们可以在我们的 Start 按钮点击事件,减去 elapsed 的时间,并使用 值作为开始时间。

// start is a DateTime object
start = DateTime.Now.Subtract(elapsed);

然后,当我们想向用户显示经过的时间时,我们可以使用我们的 elapsed 字段,并将其格式化,如。hours:minutes:seconds.milliseconds 使用一个自定义格式字符串。

// I noticed you're doing a countdown timer, so we want to display the difference
// between the original duration of 30 minutes and the elapsed time we've been running
lblStopwatch.Text = (duration - elapsed).ToString("hh\\:mm\\:ss\\.ff");

答案

如果这些提示还不够,这里有一个使用该策略的示例项目。

public partial class Form1 : Form
{
    private DateTime _startTime;
    private TimeSpan _elapsedTime;

    // The starting duration for the countdown timer
    private readonly TimeSpan _duration = TimeSpan.FromMinutes(30);

    public Form1()
    {
        InitializeComponent();
        ResetTimer();
    }

    private void ResetTimer()
    {
        _startTime = DateTime.Now;
        _elapsedTime = TimeSpan.Zero;
        UpdateStopwatchDisplay();
    }

    private void UpdateStopwatchDisplay()
    {
        // Display the current duration to the user
        lblStopwatch.ForeColor = timer1.Enabled ? Color.RoyalBlue : Color.DarkGray;
        lblStopwatch.Text = (_duration - _elapsedTime).ToString("hh\\:mm\\:ss\\.ff");
    }

    private void btnStart_Click(object sender, EventArgs e)
    {
        // Subtract 'elapsed' from 'now' to account for any stoppage time
        _startTime = DateTime.Now.Subtract(_elapsedTime);
        UpdateStopwatchDisplay();
        timer1.Start();
    }

    private void btnStop_Click(object sender, EventArgs e)
    {
        timer1.Stop();
        UpdateStopwatchDisplay();
    }

    private void btnReset_Click(object sender, EventArgs e)
    {
        ResetTimer();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        // Update elapsed time
        _elapsedTime = DateTime.Now.Subtract(_startTime);

        // Stop the timer if we've reached our duration
        if (_elapsedTime >= _duration)
        {
            _elapsedTime = _duration;
            timer1.Stop();
        }

        UpdateStopwatchDisplay();
    }
}

0
投票

.NET框架包含了一个 Stopwatch 类,所以你应该使用它。它是完全准确的,至少在你的代码按时执行其方法的程度上是如此。它的方法可以 Start, Stop, RestartReset 并且它提供了一个经过时间的 TimeSpan 你可以直接格式化,而不是所有的连接。你唯一会使用 Timer 的目的是让您可以将当前经过的时间显示在 Label. 例如:

Private ReadOnly stopwatch As New Stopwatch

Private Sub startButton_Click(sender As Object, e As EventArgs) Handles startButton.Click
    DisplayElapsedTime()

    stopwatch.Start()
    displayTimer.Start()

    startButton.Enabled = False
    stopButton.Enabled = True
    restartButton.Enabled = True
    resetButton.Enabled = False
End Sub

Private Sub stopButton_Click(sender As Object, e As EventArgs) Handles stopButton.Click
    stopwatch.Stop()
    displayTimer.Stop()

    DisplayElapsedTime()

    startButton.Enabled = True
    stopButton.Enabled = False
    restartButton.Enabled = False
    resetButton.Enabled = True
End Sub

Private Sub restartButton_Click(sender As Object, e As EventArgs) Handles restartButton.Click
    stopwatch.Restart()

    DisplayElapsedTime()
End Sub

Private Sub resetButton_Click(sender As Object, e As EventArgs) Handles resetButton.Click
    stopwatch.Reset()

    DisplayElapsedTime()
End Sub

Private Sub displayTimer_Tick(sender As Object, e As EventArgs) Handles displayTimer.Tick
    DisplayElapsedTime()
End Sub

Private Sub DisplayElapsedTime()
    elapsedTimeLabel.Text = stopwatch.Elapsed.ToString("m\:ss\.fff")
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.