Juky,
As Herfried suggests I would use a ManualResetEvent.
Here is a an example I posted a few weeks ago of a Worker class using a
ManualResetEvent to control suspending & resuming.
Public Class Worker
Public Delegate Sub Work()
Private ReadOnly m_work As Work
Private ReadOnly m_arg As Object
Private ReadOnly m_event As ManualResetEvent
Private ReadOnly m_thread As Thread
<ThreadStatic()> _
Private Shared m_current As Worker
Public Sub New(ByVal work As Work, ByVal arg As Object, ByVal name
As String)
m_work = work
m_arg = arg
m_event = New ManualResetEvent(True)
m_thread = New Thread(AddressOf Start)
m_thread.Name = name
m_thread.IsBackground = True
m_thread.Start()
End Sub
Private Sub Start()
m_current = Me
m_work.Invoke()
End Sub
Public Shared ReadOnly Property CurrentWorker() As Worker
Get
Return m_current
End Get
End Property
Public ReadOnly Property Arg() As Object
Get
Return m_arg
End Get
End Property
Public ReadOnly Property Name() As String
Get
Return m_thread.Name
End Get
End Property
Public Sub Suspend()
If Thread.CurrentThread Is m_thread Then
Throw New InvalidOperationException("Suspend should not be
called from the worker thread!")
End If
m_event.Reset()
End Sub
Public Sub [Resume]()
If Thread.CurrentThread Is m_thread Then
Throw New InvalidOperationException("Resume should not be
called from the worker thread!")
End If
m_event.Set()
End Sub
Public Sub WaitForTermination()
If Thread.CurrentThread Is m_thread Then
Throw New InvalidOperationException("WaitForTermination
should not be called from the worker thread!")
End If
m_thread.Join()
End Sub
Public Sub CheckSuspend()
If Not Thread.CurrentThread Is m_thread Then
Throw New InvalidOperationException("CheckSuspend should
only be called from the worker thread!")
End If
m_event.WaitOne()
End Sub
End Class
To see how it works try something like:
Private Sub Work()
For index As Integer = 1 To 50
Worker.CurrentWorker.CheckSuspend()
Debug.WriteLine(index, Worker.CurrentWorker.Name)
Dim value As Double = DirectCast(Worker.CurrentWorker.Arg,
Double)
Thread.Sleep(TimeSpan.FromSeconds(value))
Next
End Sub
Public Sub Main()
Dim worker1 As New Worker(AddressOf Work, 0.25, "worker1")
Dim worker2 As New Worker(AddressOf Work, 0.5, "worker2")
Dim worker3 As New Worker(AddressOf Work, 0.75, "worker3")
Debug.WriteLine("Pausing 5 seconds", "Main")
Thread.Sleep(TimeSpan.FromSeconds(5))
worker1.Suspend()
Debug.WriteLine("Pausing 5 seconds", "Main")
Thread.Sleep(TimeSpan.FromSeconds(5))
worker2.Suspend()
Debug.WriteLine("Pausing 5 seconds", "Main")
Thread.Sleep(TimeSpan.FromSeconds(5))
worker3.Suspend()
Debug.WriteLine("Pausing 1 seconds", "Main")
Thread.Sleep(TimeSpan.FromSeconds(1))
worker1.Resume()
worker2.Resume()
worker3.Resume()
Debug.WriteLine("Waiting for Termination", "Main")
worker1.WaitForTermination()
worker2.WaitForTermination()
worker3.WaitForTermination()
End Sub
The above sample was posted in a thread titled "Technique for Pausing
Worker Thread" in this newsgroup between 21 Jan 2005 & 23 Jan 2005.
Hope this helps
Jay
juky said:
Hi all,
I have 3 running threads chencking for something in my application.
Based on that I need to stop some of them safely wait for something
else and restart. Sleep is not good in my case because i don't know how
much to wait. How and from where I can put a thread in pause an restart
it?
Thank you
Juky
Sub main ()
....
t1 = New Threading.Thread(AddressOf Check1)
t1.Start()
t2 = New Threading.Thread(AddressOf Check2)
t2.Start()
t3 = New Threading.Thread(AddressOf Check3)
t3.Start()
end sub
sub Check1()
while true
"IF CHECK=TRUE THEN I HAVET TO SUSPEND THIS THREAD
end while
end Sub
sub Check2()
while true
"IF CHECK=TRUE THEN I HAVET TO SUSPEND THIS THREAD
end while
end Sub
sub Check3()
while true
"IF CHECK=TRUE THEN I HAVET TO SUSPEND THIS THREAD
end while
end Sub