21 November 2011

การใข้งาน Progress bar ด้วย Background Worker ใน Vb.Net

การใข้งาน Progress bar ด้วย Background Worker ใน Vb.Net


     โปรแกรมเมอร์หลายๆคนอาจเคยพบปัญหา เวลาที่เราดึงข้อมูลจำนวนมากมาแสดง หรือ ประมวลผลหน้าจอโปรแกรมจะ ค้าง หรือ Not Respond ไประยะหนึ่งจนมันประมวลผลเรียบร้อย ทำให้ User ไม่เข้าใจว่าโปรแกรมเรา Hang หรือทำงานอยู่และไม่จบด้วยการไป End Task มัน

 พระเอกของงานนี้คือ BackgroundWorker นั่นเอง


Event ของ BackgroundWorker มีดังนี้
  1. DoWork  'สั่งให้ทำงาน
  2. ProgressChanged   'เมื่อมีการเปลี่ยนแปลง
  3. RunWorkerCompleted  'เมื่อทำงานเสร็จ
เราจะใช้ BackgroundWorker เป็นตัวสั่งให้ Progressbar มันขยับครับ เริ่มกันเลย ผมขออนุญาติข้ามขั้นตอนเบื้องต้นไปก่อนนะครับ จะพูดแต่เนื้อหาเลย
1. เปิดโปรเจคขึ้นมาแล้วสร้างฟอร์มลักษณะดังภาพ อันประกอบไปด้วย
  1. Progressbar
  2. Backgroundworker
  3. Label
  4. Button
2. ใน event DoWork ให้เราใส่ code ดังนี้
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
     For i = 0 To 100 Step +1
         'ถ้ามีการสั่ง Cancel ให้หยุดทันที
         If BackgroundWorker1.CancellationPending = True Then
            e.Cancel = True
            Exit For
        
         Else         
           'รายงานว่ามี prgress เพิ่ม 1 progress
            BackgroundWorker1.ReportProgress(i)
            System.Threading.Thread.Sleep(100)
         End If
     Next
End Sub

3. ใน event ProgressChanged ให้เราใส่ code ดังนี้ 

Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
     'เพิ่ม 1 progress     
      Me.ProgressBar1.Value = e.ProgressPercentage
      LabelControl1.Text = e.ProgressPercentag

End Sub

4. ใน event RunWorkerCompleted  ให้เราใส่ code ดังนี้ Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    
     MsgBox("Complete")
     Me.Dispose()

End Sub

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    BackgroundWorker1.WorkerReportsProgress = True

    ProgressBar1.Maximum = 100

End Sub


เมื่อเราเตรียม BackgroundWorker Event เรียบร้อยมาถึงการสั่งทำงาน

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 
    'สั่งให้ BackgroundWorker ทำงาน
    BackgroundWorker1.RunWorkerAsync()      
   
End Sub

การหยุดการทำงานของ BackgroundWorker

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 
   If BackgroundWorker1.WorkerSupportsCancellation = True Then
   'สั่งให้ BackgroundWorker หยุดทำงาน
    BackgroundWorker1.CancelAsync()
   End if
End Sub




No comments: