Quantcast
Channel: Programming Forums
Viewing all articles
Browse latest Browse all 51036

use a button on a form to cancel operation of second thread.

$
0
0
Hi,

My plan is to have my main thread start a second thread and also show a form that will inform the user of the state of the second thread and also allow the user to select the cancel button that will stop the second thread. so far I've got the application to start the second thread - display the form, the form text updates with the information about the amount of retries the second thread has completed. My problem is that I can't press the cancel button on the form to stop the second thread. I'm really new to threading so any help about why I can't press the cancel button would be very helpful.

the code is as follows, i've modified a little for the sake of brevity.

method that creates thread
Public Function ThreadController() As String
        Dim result As GetQrResultsEnum = GetQrResultsEnum.Success
        Dim returnString As String = Nothing
        LastProcessMessagae = ""

        'create thread paramaters
        Dim ApiThreadParamaters As ThreadParamaters = New ThreadParamaters()
        'Create an array of events to wait on
        Dim waitHandles As WaitHandle() = New WaitHandle() {ApiThreadParamaters.ThreadCancled, ApiThreadParamaters.ThreadCompleted}
        Dim retryCount As Integer = 0
        Dim backgroundForm As RetryNotificationForm = Nothing

        Try
            Dim exitLoop As Boolean = False
            While exitLoop = False
                'create thread
                Dim backgroundThread As ParameterizedThreadStart = New ParameterizedThreadStart(AddressOf GetQrCode)
                Dim thread As Thread = New Thread(backgroundThread)
                thread.Name = "communicate..."
                'start the thread
                thread.Start(ApiThreadParamaters)
                If backgroundForm Is Nothing Then
                    backgroundForm = New RetryNotificationForm()
                    backgroundForm.Initialise(ApiThreadParamaters.ThreadCancled)
                    backgroundForm.Show()
                End If
                backgroundForm.SetMessage("operation processing..." & retrycount)
                
                'wait for the thread to time out or for one of the wait handles to occur
                Dim waitResult As Integer = WaitHandle.WaitAny(waitHandles, 30000)
                If waitResult = 0 Then
                    exitLoop = True
                ElseIf waitResult = 1 Then
                    'operation was completed sucessfully
                    If ApiThreadParamaters.success = GetQrResultsEnum.Success Then
                        result = GetQrResultsEnum.Success
                        LastProcessMessagae = ApiThreadParamaters.message
                        returnString = ApiThreadParamaters.QrString
                        exitLoop = True
                    ElseIf ApiThreadParamaters.success = GetQrResultsEnum.Fail Then
                        ''show the background info form
                        result = GetQrResultsEnum.Fail
                        If backgroundForm Is Nothing Then
                            backgroundForm = New RetryNotificationForm()
                            backgroundForm.Initialise(ApiThreadParamaters.ThreadCancled)
                            backgroundForm.Show()
                        End If
                        backgroundForm.SetMessage("operation processing " & retrycount)
                        retryCount = retryCount + 1
                        'reset the completed event
                        ApiThreadParamaters.ThreadCompleted.Reset()
                        If retryCount > m_MaxRetries Then
                            result = GetQrResultsEnum.Fail
                            exitLoop = True
                        End If
                ElseIf waitResult = WaitHandle.WaitTimeout Then
                    'tell the thread to end
                    ApiThreadParamaters.ThreadCancled.Set()
                    ''show the background info form
                    result = GetQrResultsEnum.FailTimeOut
                    If backgroundForm Is Nothing Then
                        backgroundForm = New RetryNotificationForm()
                        backgroundForm.Initialise(ApiThreadParamaters.ThreadCancled)
                        backgroundForm.Show()
                    End If
                    backgroundForm.SetMessage("operation processing..." & retry count)
                    retryCount = retryCount + 1
                    returnString = Nothing
                    'reset the cancled event
                    ApiThreadParamaters.ThreadCancled.Reset()
                    If retryCount > m_MaxRetries Then
                        result = GetQrResultsEnum.Fail
                        exitLoop = True
                    End If
                End If
            End While
        Catch ex As Exception
        Finally
            ''log errors if they exist.

            If backgroundForm IsNot Nothing Then
                backgroundForm.Hide()
                backgroundForm.Dispose()
                backgroundForm = Nothing
            End If

        End Try

        Return returnString
    End Function




code for thread

Private Sub GetQrCode(state As Object)
        Dim apiThreadParamaters As ThreadParamaters = state
        If apiThreadParamaters Is Nothing Then
            If state Is Nothing Then
                Throw New ArgumentNullException("State")
            Else
                Throw New ArgumentException("state was not of the expected type")

            End If
        End If
        Try
            If apiThreadParamaters.ThreadCancled.WaitOne(0) Then
                'cancel is singalled 
                apiThreadParamaters.success = False
                apiThreadParamaters.message = "The operation was canceled"
            Else
               'imagine something is being processed
               Thread.Sleep(3000)
               apiThreadParamaters.success = GetQrResultsEnum.Fail
               apiThreadParamaters.QrString = Nothing
               apiThreadParamaters.message = "An unknown error has occured"

            End If
        Catch ex As Exception
        Finally
            apiThreadParamaters.ThreadCompleted.Set()
        End Try
    End Sub



code on the click even for the cancel button on the backgroundForm from the code above
Dim cancelOperationEvent As ManualResetEvent = m_CancelOperationEvent
        If (cancelOperationEvent IsNot Nothing) Then
            cancelOperationEvent.Set()
            SetMessage("waiting for operation to cancel...")
        End If



Thank you in advance for your assistance.
Liam

Viewing all articles
Browse latest Browse all 51036

Trending Articles