Posted by : Belajar Mengelola Keuangan Feb 25, 2017

Apakah anda pernah membuat program dari VB.NET lalu program tersebut tiba-tiba freeze / not responding dikarenakan program tersebut sedang memproses sebuah task?

Di sinilah thread harus digunakan agar kita bisa memonitor proses pekerjaan sekaligus membuat program kita lebih baik.

Dalam VB.NET ada beberapa cara menggunakan threading. Tapi hal yang paling mudah adalah menggunakan salah satu komponen dari VB.NET dari background worker.

Dengan menggunakan background worker kita dengan mudah membuat, membatalkan, dan melihat proses sebuah thread.

Pertama masukan komponen background worker ke project.


Ubah properties dari background worker seperti di bawah ini.


Untuk menjalankan background worker ini, cukup panggil kode di bawah ini.

bw1.RunWorkerAsync()

Untuk proses yang akan dijalankan oleh background worker, masukan kodenya di prosedur Do_Work.

Private Sub bw1_DoWork(sender As Object, e As ComponentModel.DoWorkEventArgs) Handles bw1.DoWork
'letakan kode anda di sini
If bw1.CancellationPending Then
       bw1.ReportProgress(CInt(100 * i / jumlahproses))
       Exit For
End If
End Sub

Anda bisa membuat prosedur ini dengan cara mengklik dua kali komponen background worker-nya.

Untuk melacak prosesnya masukan kode di bawah ini di dalam prosedur ProgressChanged

Private Sub bw1_ProgressChanged(sender As Object, e As ComponentModel.ProgressChangedEventArgs) Handles bw1.ProgressChanged
        Me.pb.Value = e.ProgressPercentage
        Me.Text = "Progress (" & e.ProgressPercentage.ToString & "% complete)"
End Sub

pb yang saya tulis itu adalah komponen progressbar yang saya beri nama pb dengan maximum valuenya 100.

Bila telah selesai seluruh tugas maka secara otomatis RunWorkerCompleted akan dieksekusi.

  Private Sub bw1_RunWorkerCompleted(sender As Object, e As ComponentModel.RunWorkerCompletedEventArgs) Handles bw1.RunWorkerCompleted
        pb.Value = 0
End Sub

Tapi ketika bekerja dengan komponen background worker ini, ternyata kita tidak bisa memperbaharui tampilan pada komponen pada form. Contohnya anda tidak dapat melakukan hal seperti di bawah ini pada program anda.

Private Sub bw1_DoWork(sender As Object, e As ComponentModel.DoWorkEventArgs) Handles bw1.DoWork
    i += 1
    label1.text = i
End Sub

Intinya anda bisa melakukan proses yang tidak melibatkan proses layout. Tapi kadang-kadang hal ini bisa menjadi masalah.

Lalu bagaimana cara agar kita bisa melakukan update ketika proses pada DoWork berjalan? Kita harus menambahkan sebuah prosedur untuk merefresh tampilan. Kodenya adalah seperti di bawah ini.

Delegate Sub perbaharuiTampilannya(nilai As Integer)

Private Sub perbaharuiTampilan(nilai As Integer)
        If Me.InvokeRequired Then
            Me.Invoke(New perbaharuiTampilannya(AddressOf perbaharuiTampilan), nilai)
        Else
            label1.text = nilai
        End If
End Sub

Private Sub bw1_DoWork(sender As Object, e As ComponentModel.DoWorkEventArgs) Handles bw1.DoWork
        
        For i=0 to 10
           'panggil kode ini untuk mengupdate proses
           bw1.ReportProgress(CInt(100 * i / 10))

           'silakan panggil nama prosedurnya ketika akan mengupdate
           perbaharuiTampilan(i)
           Threading.Thread.Sleep(1000)
        Next i

End Sub

Dengan kode di atas maka merefresh tampilan tidak akan menjadi masalah.

Untuk membatalkan proses thread ini, silakan panggil metode CancelAsync.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If Button1.Text = "Start" Then
            Button1.Text = "Cancel"
            bw1.RunWorkerAsync()
        ElseIf Button1.Text = "Cancel" Then
            Button1.Text = "Start"
            bw1.CancelAsync()
        End If
End Sub

Sebagai contoh saya telah membuat form dengan beberapa komponen di dalamnya,


Kodenya adalah seperti berikut ini.

Public Class Form1

    Private Sub bw1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bw1.DoWork

        For i = 0 To 10
            'panggil kode ini untuk mengupdate proses
            bw1.ReportProgress(CInt(100 * i / 10))

            'silakan panggil nama prosedurnya ketika akan mengupdate
            perbaharuiTampilan(i)
            Threading.Thread.Sleep(1000)

            If bw1.CancellationPending Then
                bw1.ReportProgress(CInt(100 * i / 10))
                Exit For
            End If
        Next i

     
    End Sub

    Private Sub bw1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles bw1.ProgressChanged
        Me.pb.Value = e.ProgressPercentage
        Me.Text = "Progress (" & e.ProgressPercentage.ToString & "% complete)"
    End Sub

    Private Sub bw1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bw1.RunWorkerCompleted
        MsgBox("Done")
        Button1.Text = "Start"
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If Button1.Text = "Start" Then
            Button1.Text = "Cancel"
            bw1.RunWorkerAsync()
        ElseIf Button1.Text = "Cancel" Then
            Button1.Text = "Start"
            bw1.CancelAsync()
        End If

    End Sub

    Delegate Sub perbaharuiTampilannya(nilai As Integer)

    Private Sub perbaharuiTampilan(nilai As Integer)
        If Me.InvokeRequired Then
            Me.Invoke(New perbaharuiTampilannya(AddressOf perbaharuiTampilan), nilai)
        Else
            label1.text = nilai
        End If
    End Sub
End Class

Semoga artikel kali ini berguna bila anda ingin menggunakan thread dengan cara mudah.

Apakah kamu ingin mendapatkan perberitahuan tentang artikel yang baru dari catatanvbnet.blogspot.com langsung ke emailmu?

Masukan email kamu di sini dan klik Subscribe:


Leave a Reply

Subscribe to Posts | Subscribe to Comments

- Copyright © 2025 Yuk Belajar VB.NET Bersama-Sama ^^ - Hatsune Miku - Powered by Blogger - Designed by Johanes Djogan -