我在VB.NET中的计时器丢失了一秒钟

时间:2012-05-06 11:50:43

标签: vb.net time timer

我使用DateTimePicker来选择一个dateTime值,看看我有多少时间,直到它为零:

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

timeInSeconds = (DateTimePicker1.Value.Subtract(System.DateTime.Now)).ToString
                'RichTextBox1.Text = RichTextBox1.Text + vbTab + timeInSeconds.ToString
                timeInSeconds = timeInSeconds.Substring(0, timeInSeconds.LastIndexOf("."))

End Sub

上面的RichTextbox显示我大约每30秒钟松开一秒钟:

23:59:47.4060217
23:59:46.3939638
23:59:45.3799058
23:59:44.3648477
23:59:43.3517898
23:59:42.3377318
23:59:41.3236738
23:59:40.3096158
23:59:39.2955578
23:59:38.2814998
23:59:37.2674418
23:59:36.2533838
23:59:35.2393258
23:59:34.2242677
23:59:33.2112098
23:59:32.1981518
23:59:31.1830938
23:59:30.1690358
23:59:29.1549778
23:59:28.1409198
23:59:27.1268618
23:59:26.1128038
23:59:25.0997458
23:59:24.0856878
23:59:23.0716298
23:59:22.0575718
23:59:21.0435138
23:59:20.0284558
23:59:19.0143978
**23:59:18.0013398
23:59:16.9872818**

所以使用

timeInSeconds = timeInSeconds.Substring(0, timeInSeconds.LastIndexOf("."))

从23:59:18到23:59:16

为什么会这样?我做错了什么? 是时候了

(DateTimePicker1.Value.Subtract(System.DateTime.Now)).ToString

发生了我失去了吗?

定时器设置为每秒进行一次更改。

如何才能获得正确的结果?

提前致谢!

2 个答案:

答案 0 :(得分:0)

尽量不要直接附加文本,而是将结果连接到tmp字符串中。 之后将tmp分配给textbox1.text。

我一直处在这样的情况下,我必须在每次forloop迭代中修改一个文本框,以十六进制显示一个字节,当我转换到以前的方法时,结果令人印象深刻。

试一试。

来自评论:

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
  Dim timeInSeconds = (DateTimePicker1.Value.Subtract(System.DateTime.Now)).ToString 
  'RichTextBox1.Text = RichTextBox1.Text + vbTab + timeInSeconds.ToString
  timeInSeconds = timeInSeconds.Substring(0, timeInSeconds.LastIndexOf("."))
  TextBox1.Text &= timeInSeconds & vbNewLine
End Sub

我在1000 milisec计时器中测试了这段代码,没有问题。

答案 1 :(得分:0)

准确度会根据您正在做的事情以及同时发生的所有其他事情而变化。您可以通过每次重置间隔来纠正它。现在,当您正在执行的任务超过一秒时,这会发生故障,但它会使得滴答声尽可能接近第二个。

   Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
     Timer1.Enabled = False

     'do your stuff here

     Timer1.Interval = 1000 - Date.Now.Millisecond
     Timer1.Enabled = True

  End Sub

当我想要每小时或每小时发生一些事情时,我通常会使用这种技术。