vb.net Application.DoEvents()函数在windows vista中暂停和崩溃应用程序

时间:2011-07-18 02:55:45

标签: vb.net

我提出了串行通信申请。对于这个应用程序,我需要设置延迟时间。在这个延迟时间我正在做一些其他任务。所以对于那些我需要从延迟函数中取回控制的任务,为此目的我没有使用Doevents()函数。它工作正常在其他操作系统(XP,Windows7 32/64位)。但 Application.DoEvents()功能在Windows Vista中停止并崩溃。所以有任何解决方案

 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

提前致谢

4 个答案:

答案 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%。