Gracefully suspending / stopping a thread

Hi
I have just now learning about threads.  
Here is what I want do to......   I wish to create a thread and "Start" it.

I want to be able to suspend it (and later use it again) in my application.
I also wold like to destroy it as I close my application.

Of course,  I would like to do this gracefully.

I would appreciate a short demo.

Thanks
peispudAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Mike TomlinsonMiddle School Assistant TeacherCommented:
You can't really suspend a thread at any given time...you have to pick discrete points in the thread loop/code where YOU check some kind of flag and then put the thread into a waiting state.  One way to accomplish this is with a ManualResetEvent.

Here is an example using a simple "clock thread"...add a Label and two Buttons to a blank form:
Public Class Form1
 
    Private WithEvents clk As Clock
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        clk = New Clock
    End Sub
 
    Private Sub clk_CurrentTime(ByVal dt As Date) Handles clk.CurrentTime
        Label1.Text = dt.ToString
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        clk.SuspendThread()
    End Sub
 
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        clk.ResumeThread()
    End Sub
 
    Private Class Clock
 
        Private Suspend As Boolean = False
        Private T As System.Threading.Thread
        Public Event CurrentTime(ByVal dt As DateTime)
        Private SC As System.Threading.SynchronizationContext
        Private MRE As New System.Threading.ManualResetEvent(False)
 
        Public Sub New()
            SC = System.Windows.Forms.WindowsFormsSynchronizationContext.Current
            T = New System.Threading.Thread(AddressOf TickTock)
            T.IsBackground = True ' <-- allow thread to be killed automatically when app closes
            T.Start()
        End Sub
 
        Private Sub TickTock()
            While True
                System.Threading.Thread.Sleep(1000)
                SC.Post(New System.Threading.SendOrPostCallback(AddressOf TimeHack), DateTime.Now)
 
                If Suspend Then
                    MRE.Reset()
                    MRE.WaitOne() ' will STOP and WAIT here until MRE is signaled w/ the Set() method
                    Suspend = False
                End If
            End While
        End Sub
 
        Private Sub TimeHack(ByVal state As Object)
            RaiseEvent CurrentTime(state)
        End Sub
 
        Public Sub SuspendThread()
            Suspend = True
        End Sub
 
        Public Sub ResumeThread()
            MRE.Set()
        End Sub
 
    End Class
 
End Class

Open in new window

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
peispudAuthor Commented:
Thank you very much!!  I will have to think through your response,  but you have answered my question perfectly.  Much appreciated!!
0
Mike TomlinsonMiddle School Assistant TeacherCommented:
Glad it was helpful.  I understand that's a lot to take in...feel free to ask any questions about it and I'll do my best to answer them.  =)
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
.NET Programming

From novice to tech pro — start learning today.