' Function pointer to method to update GUI
Private Delegate Sub UpdateGUIDelegate(ByVal Bval As Integer)
' Method to update the GUI
Public Sub UpdateGUI(ByVal Bval As Integer)
' Check to see who is calling this method. If other then GUI thread
' create delegate to make the call.
If Me.txtEvent.InvokeRequired() Then
Dim myD1 As New UpdateGUIDelegate(AddressOf UpdateGUI)
Me.txtEvent.Invoke(myD1, Bval)
Else
Me.txtEvent.Text = "A=" & Bval
End If
End Sub
#End Region
The code that the thread runs (in a seperate class)
Public Sub WorkCount()
While intA < 10000
While intB < 100
intB += 1
System.Threading.Thread.Sleep(50)
End While
Form1.UpdateGUI(intA)
intB = 0
intA += 1
End While
intA = 0
End Sub
GUI (windows form) class
Dim myWorkers(3) As JWorker
Dim myThreads(3) As Threading.Thread
Dim FlagStop As Boolean = False
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim I As Integer
For I = 1 To 3
myWorkers(I) = New JWorker(I)
AddHandler myWorkers(I).JWorkerEvent, AddressOf Jeventrecieved
myThreads(I) = New System.Threading.Thread(AddressOf myWorkers(I).WorkCount)
myThreads(I).IsBackground = True
Next
End Sub
Private Delegate Sub JeventDelegate(ByVal myInt As Integer)
Private Sub Jeventrecieved(ByVal myInt As Integer)
If Me.InvokeRequired Then
Me.Invoke(New JeventDelegate(AddressOf Jeventrecieved), New Object() {myInt})
Else
Me.txtEvent.Text = "A=" & myInt
End If
End Sub
Worker Class
Public Class JWorker
Public Event JWorkerEvent(ByVal intV As Integer)
Dim myform As Form1
Public intA As Integer
Public intB As Integer
Public Sub New(ByRef ID As Integer)
intA = 0
intB = 0
End Sub
Public Sub WorkCount()
While intA < 10000
While intB < 100
intB += 1
System.Threading.Thread.Sleep(50)
End While
RaiseEvent JWorkerEvent(intA)
intB = 0
intA += 1
End While
intA = 0
End Sub
End Class
GUI (form Class)
===============
Dim myWorkers(3) As JWorker
Dim myThreads(3) As Threading.Thread
Dim FlagStop As Boolean = False
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim I As Integer
For I = 1 To 3
myWorkers(I) = New JWorker(I)
AddHandler myWorkers(I).JWorkerEvent, AddressOf Jeventrecieved
myThreads(I) = New System.Threading.Thread(AddressOf myWorkers(I).WorkCount)
myThreads(I).IsBackground = True
Next
End Sub
#Region "Update GUI"
Private Delegate Sub JeventDelegate(ByVal sender As System.Object, ByVal e As JWorkerEventArgs)
Private Sub Jeventrecieved(ByVal sender As System.Object, ByVal e As JWorkerEventArgs)
If Me.InvokeRequired Then
Me.Invoke(New JeventDelegate(AddressOf Jeventrecieved), New Object() {sender, e})
Else
Me.txtEvent1.Text = sender & " " & e.MyNumber
End If
End Sub
Worker Class and Arguement class
===================================
Public Class JWorkerEventArgs
Inherits System.EventArgs
Private _MyNumber As Integer
Public ReadOnly Property MyNumber()
Get
Return _MyNumber
End Get
End Property
Public Sub New(ByVal myNumber As Integer)
_MyNumber = myNumber
End Sub
End Class
Public Class JWorker
Public Event JWorkerEvent As EventHandler(Of JWorkerEventArgs)
Public intA As Integer
Public intB As Integer
Property A() As Integer
Get
Return intA
End Get
Set(ByVal value As Integer)
intA = A
End Set
End Property
Property B() As Integer
Get
Return intB
End Get
Set(ByVal value As Integer)
intB = B
End Set
End Property
Public Sub New(ByRef ID As Integer)
intA = 0
intB = 0
End Sub
Public Sub WorkCount()
While intA < 10000
While intB < 100
intB += 1
System.Threading.Thread.Sleep(50)
End While
RaiseEvent JWorkerEvent(Me, New JWorkerEventArgs(intA))
intB = 0
intA += 1
End While
intA = 0
End Sub
End Class
Public Class Form1
Dim myWorkers As New List(Of JWorker)
Dim FlagStop As Boolean = False
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
System.Threading.ThreadPool.SetMaxThreads(2, 100)
For i As Integer = 1 To 3
DoWork(i)
Next
End Sub
Private Sub DoWork(ByVal ID As Integer) ' Assume ID is unique.
Dim MyWorker As New JWorker(ID)
SyncLock myWorkers
myWorkers.Add(MyWorker)
End SyncLock
AddHandler MyWorker.JWorkerWorking, AddressOf Jeventrecieved
AddHandler MyWorker.JWorkerFinised, AddressOf RemoveFromList
System.Threading.ThreadPool.QueueUserWorkItem(AddressOf MyWorker.WorkCount)
End Sub
Private Delegate Sub JeventDelegate(ByVal myInt As Integer, ByVal myID As Integer)
Private Sub Jeventrecieved(ByVal myInt As Integer, ByVal myID As Integer)
If Me.InvokeRequired Then
Me.Invoke(New JeventDelegate(AddressOf Jeventrecieved), New Object() {myInt, myID})
Else
Me.txtEvent.Text = System.String.Format("A= {0} ({1})", myInt, myID)
End If
End Sub
Private Sub RemoveFromList(ByVal myID As Integer)
SyncLock myWorkers
For i As Integer = 0 To myWorkers.Count - 1
If myWorkers(i).ID = myID Then
myWorkers.RemoveAt(i)
Exit For
End If
Next
End SyncLock
End Sub
End Class
'Worker Class
Public Class JWorker
Public Event JWorkerWorking(ByVal intV As Integer, ByVal ID As Integer)
Public Event JWorkerFinised(ByVal ID As Integer)
Public intA As Integer
Public intB As Integer
Public Property ID As Integer
Public Sub New(ByVal id As Integer)
Me.ID = id
intA = 0
intB = 0
End Sub
Public Sub WorkCount()
While intA < 10000
While intB < 100
intB += 1
System.Threading.Thread.Sleep(0)
End While
RaiseEvent JWorkerWorking(intA, Me.ID)
intB = 0
intA += 1
End While
intA = 0
RaiseEvent JWorkerFinised(ID)
End Sub
End Class
Dim myD1 As New UpdateGUIDelegate(AddressO
Me.txtEvent.Invoke(myD1, Bval)
and change the content from UpdateGUI to:
Public Sub UpdateGUI(ByVal Bval As Integer)
Me.txtEvent.Text = "A=" & Bval
End Sub