vb.netmultithreadinginvokerequired

How to access richtextbox via different thread


Hey guys my question is how can I access (update/read) richtextbox in a thread. I just created a very simple code for you to understand what I am doing. I searched some articles on internet mentioned about invoke, delegate or backgroundworker, hope someone can come and tell me which and how to use. Really thanks.

Imports System.Threading

Public Class form1

Dim flag As Boolean = True
Dim startbtn As Thread
Dim stopbtn As Thread

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    startbtn = New Thread(AddressOf startfuction)
    startbtn.Start()
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    stopbtn = New Thread(AddressOf stopfunction)
    stopbtn.Start()
End Sub

'************** thread 1

Private Sub startfuction()
    flag = True
    While flag = True
        richtextbox1.text = "Your process started"         'error
    End While

End Sub

'************** thread 2
Private Sub stopfunction()
    flag = False
    startbtn.Abort()
    MsgBox("You ended the process")
End Sub

End Class


Solution

  • Imports System.Threading
    
    Public Class Form1
    
    Dim flag As Boolean = True
    Dim startbtn As Thread
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        startbtn = New Thread(AddressOf startfuction)
        startbtn.Start()
    End Sub
    
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        flag = False
        MsgBox("You ended the process")
    End Sub
    
    '************** thread 1
    
    Private Sub startfuction()
        flag = True
        While flag = True
            Me.Invoke(Sub() RichTextBox1.Text = "Your process started")         'error
        End While
        Me.Invoke(Sub() RichTextBox1.Text = "Your process stopped")         'error
    
    End Sub
    End Class
    

    EDIT 1

    Also when running threads, When you goto close your app you could run into problems because your threads will end prematurely..

    do something like

    Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        flag = False
        Application.DoEvents()
    End Sub