如何在新线程上创建计时器

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

我最近问了一个问题,如何让垂直线从左到右扫过图片框。图片框中有一些形状,垂直线必须表明它何时穿过形状。 我有一个非常有效的答案。

Private lineX As Integer = 0

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    lineX += 5

    If lineX > PictureBox1.Width Then
        lineX = 0
    End If

    PictureBox1.Invalidate()
End Sub

Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    e.Graphics.DrawLine(Pens.Black,
                        New Point(lineX, 0),
                        New Point(lineX, PictureBox1.Height))
End Sub

但是,我发现当我在图片框中移动鼠标时,垂直线会停止、开始或减慢。从网上看,我认为不同线程上的计时器可能是答案。

有人可以建议解决这个问题吗?

vb.net timer picturebox
1个回答
0
投票

您可以通过考虑有效经过的时间来提高运动的准确性:

Private lineX As Integer = 0
Private lastDateTime As Date?

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    PictureBox1.Invalidate()
End Sub

Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    Dim now = Date.Now
    If lastDateTime.HasValue Then
        lineX += CInt(5 * (now - lastDateTime.Value).Milliseconds / Timer1.Interval)
    Else
        lineX += 5
    End If
    lastDateTime = now

    If lineX > PictureBox1.Width Then
        lineX = 0
    End If
    e.Graphics.DrawLine(Pens.Black,
                        New Point(lineX, 0),
                        New Point(lineX, PictureBox1.Height))
End Sub

请注意,我将更改线条位置的代码移至

PictureBox1_Paint
方法中,以获取绘制线条的准确时间。

绘制可能会在

PictureBox1.Invalidate()
之后延迟,并且绘制也可能发生在其他情况下,例如,当窗口大小调整或移动等时。

如果系统繁忙,某些对

PictureBox1_Paint
的呼叫甚至可能会被挂断。

即使经过这些改变,运动也不会是完美的。 WinForms 并不是适合游戏之类的系统。

© www.soinside.com 2019 - 2024. All rights reserved.