Private Sub TimeDelay(ByVal DT As Integer)
Dim StartTick As Integer
StartTick = Environment.TickCount()
While ((Environment.TickCount() - StartTick) <= DT)
Application.DoEvents()
End While
'Application.DoEvents()
End Sub
提前致谢
答案 0 :(得分:2)
尝试使用BackgroundWorker组件,而不是调用Application.DoEvents()
。
答案 1 :(得分:1)
请在Application.DoEvents之后尝试System.Threading.Thread.SpinWait(10),它可能会有效。
答案 2 :(得分:0)
您不应该为此目的使用DoEvents。
创建一个单独的线程来运行您提供的代码。并使用回调(线程已完成)通知时间已过。
Imports System.Threading
Public Class Tester
Shared WithEvents oSquare As SquareClass = New SquareClass()
Public Shared Sub Main
Dim t As Thread
t = New Thread(AddressOf oSquare.TimeDelay)
t.Start()
End Sub
Shared Sub SquareEventHandler() Handles oSquare.ThreadComplete
Console.WriteLine("Completed")
End Sub
End Class
Public Class SquareClass
Public DT As Integer = 5000 ' 5 seconds (edited thanks to Mathias)
Public Event ThreadComplete()
Public Sub TimeDelay()
Dim StartTick As Integer
StartTick = Environment.TickCount()
While ((Environment.TickCount() - StartTick) <= DT)
thread.sleep(1000)
End While
RaiseEvent ThreadComplete()
End Sub
End Class
答案 3 :(得分:0)
我建议在循环中放入一个“System.Threading.Thread.Sleep(1)”。可能会发生这种情况,因为Windows要处理的事件太多,因此以高CPU使用率结束。
睡眠1毫秒很少(实际上只有0,001秒)。它还会大大降低CPU使用率,同时仍然允许程序保持响应。
最终的代码是:
Private Sub TimeDelay(ByVal DT As Integer)
Dim StartTick As Integer
StartTick = Environment.TickCount()
While ((Environment.TickCount() - StartTick) <= DT)
Application.DoEvents()
System.Threading.Thread.Sleep(1)
End While
'Application.DoEvents()
End Sub
尝试运行此代码:
TimeDelay(1000000)
您会注意到,在此过程中,程序将使用您的代码消耗几乎100%的CPU,但与我的代码消耗0%。