HENDIKA

Wednesday, 12 February 2014

Threading merupakan salah satu teknik pemrograman yang menurut sebagian orang rumit dan membingungkan karena kompleksitasnya. Tapi untunglah, di .NET Framework, Microsoft telah menyediakan sebuah komponen khusus untuk menangani kegiatan threading ini yang membuat segalanya jadi lebih mudah.

Komponen tersebut adalah BackgroundWorker. Dari namanya sudah dapat ditebak kegunaan dari komponen ini bukan :)
Terdapat 2 method utama pada komponen ini antara lain :
  • RunWorkerAsync : untuk memerintahkan thread agar mulai aktif dan menjalankan tugasnya.
  • CancelAsync : untuk menghentikan thread secara “paksa”.
Selain method terdapat 3 event utama yang dimiliki oleh BackgroundWorker yang memungkinkan kita mengontrol sebuah thread.
Event tersebut adalah :
  • DoWork : Event ini dibangkitkan ketika method RunWorkerAsync dipanggil yang menandakan bahwa thread diperintahkan untuk aktif. Di event inilah routine yang perlu dilakukan oleh thread dieksekusi. Contohnya, membuka file, melakukan pengambilan data dari database server, dan sebagainya.
  • ProgressChanged : Event ini dibangkitkan ketika thread sedang bekerja. Di event ini biasanya digunakan untuk menjalankan ProgressBar untuk menginformasikan sejauh mana thread telah melakukan tugasnya.
  • RunWorkerCompleted : Event ini dibangkitkan ketika thread selesai menjalankan routine yang dibebankan pada event DoWork. Biasanya di event ini terdapat routine-routine yang dijalankan ketika suatu thread selesai menjalankan routine nya. Misal, menghapus file yang sudah berhasil dibaca oleh thread, menutup koneksi database, mengeluarkan MessageBox dan sebagainya.
Baiklah mari kita coba mempraktekkan threading ini biar langsung terasa khasiatnya :P

1. Buat form VB Net 2008 sbg berikut :
  • Button Start, beri nama btnStartWork
  • Button Stop, beri nama btnStopWork
  • Label, beri nama lblWorkStatus
  • ProgressBar, beri nama prgWorkProgress
  • BackgroundWorker, beri nama BackgroundActivity. Ubah properti WorkerReportsProgress dan WorkerSupportsCancelation ke True
2. Susun komponen sesuai selera :

3. Kopi paste kode dibawah ini :

Imports System.ComponentModel
Imports System.ThreadingPublic Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
Private Sub BackgroundActivity_DoWork( _
ByVal sender As Object, ByVal e As _
System.ComponentModel.DoWorkEventArgs) _
Handles BackgroundActivity.DoWork
' ----- The background work starts here.
Dim theBackground As BackgroundWorker
' ----- Call the background thread.
theBackground = CType(sender, BackgroundWorker)
TheBusyWork(theBackground)
' ----- Check for a cancellation.
If (theBackground.CancellationPending = True) Then _
e.Cancel = True
End Sub
Private Sub BackgroundActivity_ProgressChanged( _
ByVal sender As Object, ByVal e As _
System.ComponentModel.ProgressChangedEventArgs) _
Handles BackgroundActivity.ProgressChanged
' ----- The background task updated its progress.
prgWorkProgress.Value = e.ProgressPercentage
End Sub
Private Sub BackgroundActivity_RunWorkerCompleted( _
ByVal sender As Object, ByVal e As _
System.ComponentModel.RunWorkerCompletedEventArgs) _
Handles BackgroundActivity.RunWorkerCompleted
' ----- Finished.
If (e.Cancelled = True) Then
lblWorkStatus.Text = "Cancelled."
Else
lblWorkStatus.Text = "Complete."
End If
prgWorkProgress.Visible = False
prgWorkProgress.Value = 0
btnStopWork.Enabled = False
btnStartWork.Enabled = True
End Sub
Private Sub TheBusyWork(ByVal workerLink As BackgroundWorker)
' ----- Perform some work.
For counter As Integer = 1 To 10
' ----- See if we should jump out now.
If (workerLink.CancellationPending = True) Then _
Exit For
' ----- Take a nap for 2 seconds.
Thread.Sleep(2000)
' ----- Inform the primary thread that we've
' made significant progress.
workerLink.ReportProgress(counter * 10)
Next counter
End Sub
Private Sub StartWork_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnStartWork.Click
' ----- Start the background process.
btnStartWork.Enabled = False
btnStopWork.Enabled = True
lblWorkStatus.Text = "Progress…"
prgWorkProgress.Value = 0
prgWorkProgress.Visible = True
BackgroundActivity.RunWorkerAsync()
End Sub
Private Sub StopWork_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnStopWork.Click
' ----- Tell the worker thread to stop.
BackgroundActivity.CancelAsync()
End Sub
End Class


Jalankan program dan tekan tombol Start. Dapat dilihat bahwa progress bar berubah seiring dengan kemajuan background worker dalam melakukan loop, yang disini dilakukan pada method TheBusyWork.
Proses ini dijalankan dalam thread yang berbeda dari thread utama (form yang sedang terbuka saat ini) jadi, jika thread ini mengalami crash, maka tidak akan mempengaruhi thread utama. Itulah salah satu keuntungan dari threading. Anda pun dapat menghentikan thread ini kapanpun anda mau tanpa mengganggu jalannya thread utama. Dalam praktikum ini anda dapat menekan tombol Stop untuk menghentikan thread.
Dari program sederhana diatas, method RunWorkerAsync() dipanggil saat menekan tombol Start, yang kemudian memanggil method TheBusyWork, dimana diletakkan routine yang harus dikerjakan oleh thread.
Kemudian BackgroundWorker akan mulai bekerja dan membangkitkan event ProgressChanged, dimana di event ini terdapat routine untuk melaporkan progress saat ini ke progress bar.
Saat routine pada method TheBusyWork telah selesai dieksekusi, event RunWorkerCompleted akan dibangkitkan, dimana anda dapat meletakkan routine2 yang akan dilakukan ketika thread tersebut telah selesai melakukan tugasnya.
Perlu diingat, dalam thread yang terpisah dari form utama, JANGAN melakukan routine yang langsung berinteraksi atau mengubah form utama, karena program akan error. Gunakan event ProgressChanged untuk berintaraksi antara thread baru dengen form (thread utama)
Gampang kan? .NET benar-benar telah mempermudah hidup programmer dengan menyediakan komponen2 sakti yang siap pakai. Padahal implementasi threading merupakan salah satu momok terbesar dalam teknik pemrograman dan sangat sulit untuk diimplementasikan.
Pertanyaan, saran & kritik diterima dengan senang hati ^^

Sumber Artikel : http://renxe.wordpress.com/2008/07/29/tutorial-threading-pada-visual-basic-net-2005/

0 komentar:

Post a Comment