- Back to Home »
- Multi Threading »
- Menggunakan Background Worker
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.
Untuk proses yang akan dijalankan oleh background worker, masukan kodenya di prosedur Do_Work.
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
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.
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.
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.
Dengan kode di atas maka merefresh tampilan tidak akan menjadi masalah.
Untuk membatalkan proses thread ini, silakan panggil metode CancelAsync.
Sebagai contoh saya telah membuat form dengan beberapa komponen di dalamnya,
Kodenya adalah seperti berikut ini.
Semoga artikel kali ini berguna bila anda ingin menggunakan thread dengan cara mudah.
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,
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?