Loading User Information from Channel 9
Something went wrong getting user information from Channel 9
Loading User Information from MSDN
Something went wrong getting user information from MSDN
Loading Visual Studio Achievements
Something went wrong getting the Visual Studio Achievements
Multi-threading Debugging Enhancements in Visual Studio 2008
Nov 27, 2007 at 3:09 PMHello,
Strict OnI've included the code for a class that I'm struggling with.
(I've omitted the FormStatus object, but any form with a lblStatus label would do).
The purpose of the class is to display a StatusForm on a separate thread.
The StatusForm has a rotating logo, and a label that can get updated to reflect status on the main thread...
Sample usage from some class, or form...(within a loop or long running routine)
'Would be called to display a "TopMost" form indicating status..
ClsAsyncStatusDisplay.DisplayStatus("Doing something...")
ClsAsyncStatusDisplay.DisplayStatus("25% Complete...")
ClsAsyncStatusDisplay.DisplayStatus("50% Complete...")
'Would be called to hide the form from view
ClsAsyncStatusDisplay.HideStatus()
My class works 99% of the time, but occassionally the class "locks up"...
I'm open to ANY suggestions! -- I'm sure there's a much better tecnique than this...
Thanks.
Option
Option Explicit On
Public
Class ClsAsyncStatusDisplay Private Shared _thisInstance As ClsAsyncStatusDisplay Private Message As String = ""Private WithEvents StatusThread As System.Threading.Thread
Private WithEvents StatusForm As FormStatus
Private Delegate Sub SetTextCallback(ByVal [text] As String) Private _DelegateSetTextCallBack As New SetTextCallback(AddressOf SetText) Private Delegate Sub CloseFormCallBack() Private _DelegateCloseFormCallBack As New CloseFormCallBack(AddressOf CloseForm) Private Sub New() 'Forces Singleton Class End Sub Public Shared Sub DisplayStatus(ByVal msg As String, Optional ByRef obj As Control = Nothing) If IsNothing(_thisInstance) Then
_thisInstance =
New ClsAsyncStatusDisplay End If If IsNothing(_thisInstance.StatusThread) Then_thisInstance.StatusThread =
New System.Threading.Thread(AddressOf _thisInstance.ShowForm)System.Threading.Thread.Sleep(750)
'Don't display status unless outside process is taking almost 1 second to complete...._thisInstance.StatusThread.Start()
ElseIf Not IsNothing(_thisInstance.StatusThread) And _thisInstance.StatusThread.ThreadState = Threading.ThreadState.Stopped Then_thisInstance.StatusThread =
Nothing_thisInstance.StatusThread =
New System.Threading.Thread(AddressOf _thisInstance.ShowForm)System.Threading.Thread.Sleep(750)
'Don't display status unless outside process is taking almost 1 second to complete...._thisInstance.StatusThread.Start()
Else_thisInstance.SetText(msg)
End If_thisInstance.Message = msg
End Sub Public Shared Sub HideStatus() If Not IsNothing(_thisInstance.StatusForm) Then_thisInstance.CloseForm()
End If End Sub Private Sub ShowForm() Try If IsNothing(_thisInstance.StatusForm) OrElse _thisInstance.StatusForm.IsDisposed Then_thisInstance.StatusForm =
New FormStatus End IfSetText(_thisInstance.Message)
If _thisInstance.StatusForm.IsDisposed = False Then_thisInstance.StatusForm.ShowDialog()
End If Catch ex As Exception 'Do Nothin' Me.CloseForm() End Try End Sub Private Sub CloseForm() Try If _thisInstance.StatusForm.InvokeRequired Then_thisInstance.StatusForm.Invoke(_DelegateCloseFormCallBack)
Else If Not IsNothing(_thisInstance.StatusForm) And Not _thisInstance.StatusForm.IsDisposed Then_thisInstance.StatusForm.Close()
End If End If Catch ex As Exception 'Do Nothin' End Try End Sub Private Sub SetText(ByVal [text] As String) Try If Not IsNothing(_thisInstance.StatusForm) AndAlso _thisInstance.StatusForm.Disposing = False AndAlso _thisInstance.StatusForm.IsDisposed = False Then ' InvokeRequired required compares the thread ID of the ' calling thread to the thread ID of the creating thread. ' If these threads are different, it returns true. If _thisInstance.StatusForm.lblStatus.InvokeRequired Then_thisInstance.StatusForm.lblStatus.Invoke(_DelegateSetTextCallBack,
New Object() {[text]}) Else_thisInstance.StatusForm.lblStatus.Text = [text]
End If End If Catch ex As Exception 'do nothin Me.CloseForm() End Try End SubEnd
Class