开发者

vb.net Application.DoEvents() function halt and crash application in windows vista

i made an application for serial communication. for this application i need to set delay time. during this delay time i m doing some other task. So for those task i need to take back control from delay function, for this purpose i am unsing Doevents() function.Its work fine On other OS (XP, Windows7 32/64-bit). But Application.DoEvents() function halt and crash in windows vista.So is there any solution

 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

thanks in advance


Try using a BackgroundWorker component instead of calling Application.DoEvents().


Please try System.Threading.Thread.SpinWait(10) after the Application.DoEvents, it might work.


I would recommend putting a "System.Threading.Thread.Sleep(1)" in the loop as well. It might happen because there are too many events pending for Windows to process, therefore ending in high CPU usage.

Sleeping 1 millisecond is very little (actually only 0,001 second). And it would decrease CPU usage dramatically as well, while still allowing the program to remain responsive.

The final code would be:

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

Try running this code:

TimeDelay(1000000)

You will notice that in the process, the program will consume almost 100% CPU with your code, but 0% with mine.


You shouldn't use DoEvents for this purpose.

Create a seperate thread to run the code you have provided. And use a call back (thread completed) to notify when the time has elapsed.

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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜