Re: Thread class in Framework 2.0

Tech-Archive recommends: Speed Up your PC by fixing your registry



Dodo,
In addition to the other comments.

Here is a an example I posted February 2005 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 initially posted in a thread titled "Technique for
Pausing Worker Thread" in the microsoft.public.dotnet.languages.vb newsgroup
between 21 Jan 2005 & 23 Jan 2005.

Hope this helps
Jay


"Dodo Cibelli" <DodoCibelli@xxxxxxxxxxxxxxxxxxxxxxxxx> wrote in message
news:2A199705-4FEE-4724-9E79-A11157023553@xxxxxxxxxxxxxxxx
|
| In the .NET Framwrok 2.0 the methods
|
| Suspend();
| Resume();
|
| of the Thread Class are marked as Obsolete
|
| [ObsoleteAttribute("Thread.Resume has been deprecated. Please use other
| classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore,
to
| synchronize Threads or protect resources.
| http://go.microsoft.com/fwlink/?linkid=14202";, false)]
| public void Resume();
|
| How if I have a backgroud thread ( say a very long and time consuming
| simulation ) and I want to easily give the use the ability to suspend it
to
| use his pc for a while without that load ?
| And then resume it ?
| I do beleve that this is not the the right way to sincornize Threads but
| what if you want just to suspend a thread.
|
|


.



Relevant Pages

  • Re: Multithread Stop/Restart
    ... Which allows the worker thread to suspend itself. ... > Private Sub Work() ... How and from where I can put a thread in pause an restart ...
    (microsoft.public.dotnet.languages.vb)
  • Re: Threading a ShowDialog? - progress form.
    ... However in practice I am sure you will find the BackgroundWorker component to be significantly easier. ... Sub A calls B calls C ... WorkerForm is a base form that has the common routines along with the progress bar & background worker. ... I would like to show a Progress Bar / form in modal/ShowDialog format when this runs and slowely update the progress bar as each sub runs. ...
    (microsoft.public.dotnet.languages.vb)
  • Re: Tk: Call subroutine when MainWindow is realized?
    ... than it actually is, because I add an activity bar, and have 3 worker ... foreach my $dthread{ ... share ($shash{$dthread}{'frame_open'}); ... $mw->repeat(10, sub{ ...
    (comp.lang.perl.misc)
  • Re: Multithreading with DirectoryServices
    ... The first issue is how do you supply the data to each worker thread. ... Dequeue the next Queue item as it needs it. ... Private Sub WorkerThread() ... Private m_lock As New Object ...
    (microsoft.public.dotnet.languages.vb)
  • RE: backgroundworker Question
    ... You should be using the worker as follows: ... private void bgAddTime_DoWork ... > Private QueueWorker As New BackgroundWorker ... > Private Sub LoadInitialQueue(ByVal sender As Object, ...
    (microsoft.public.dotnet.framework.windowsforms)