I have a logging function that get called from different threads. The logging function uses InvokeRequired
to determine if the caller is in the same thread as the textbox was created in. If all the code is put into the same class it works fine. But when separated out InvokeRequired
always returns false
.
Imports System.Threading
Public Class Test_Main
Dim tt_object As Test_Thread = Test_Thread.Get_Test_Thread_Class()
Private Shared logger_lock As New Object
Delegate Sub WriteLogMessage_Callback(text As String)
Private Sub btn_start_Click(sender As Object, e As EventArgs) Handles btn_start.Click
WriteLogMessage("From - btn_start_Click")
tt_object.Start_Threads()
End Sub
Public Sub WriteLogMessage(ByVal message As String)
If (Me.InvokeRequired) Then
Dim d As New WriteLogMessage_Callback(AddressOf WriteLogMessage)
Me.Invoke(d, New Object() {[message]})
Else
SyncLock logger_lock
log_box.Text += System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff") & " " & message & vbCrLf
log_box.SelectionStart = log_box.Text.Length
log_box.ScrollToCaret()
End SyncLock
End If
Application.DoEvents()
End Sub
End Class
Public Class Test_Thread
Private Shared _thisInstance As Test_Thread = Nothing
Private t_1 As Thread
Private t_2 As Thread
Protected Sub New() 'Class constructor
t_1 = New Thread(AddressOf Thread_1)
t_2 = New Thread(AddressOf Thread_2)
End Sub
Public Shared Function Get_Test_Thread_Class() As Test_Thread
If _thisInstance Is Nothing Then 'Initialize object if it hasn't laready been done
_thisInstance = New Test_Thread()
End If
Return _thisInstance 'Return the object instance
End Function
Public Sub Start_Threads()
Dim counter As Integer = 0
Test_Main.WriteLogMessage("BEGIN - Start_Threads")
t_1.Start()
t_2.Start()
Do While counter < 50
Application.DoEvents()
Thread.Sleep(500)
counter += 1
Loop
t_1.Abort()
t_2.Abort()
Test_Main.WriteLogMessage("END - Start_Threads")
End Sub
Public Sub Thread_1()
Dim counter As Integer = 0
Test_Main.WriteLogMessage("BEGIN - Thread_1")
Do While True
Test_Main.WriteLogMessage("Thread_1: " & counter)
counter += 1
Thread.Sleep(1000)
Loop
End Sub
Public Sub Thread_2()
Dim counter As Integer = 0
Test_Main.WriteLogMessage("BEGIN - Thread_2")
Do While True
Test_Main.WriteLogMessage("Thread_2: " & counter)
counter += 1
Thread.Sleep(1500)
Loop
End Sub
End Class