[VB.NET] การใช้งาน Progress Bar ด้วย BackgroundWorker
http://www.g2gnet.com/webboard/images/vbnet/backgroundmain.pngพอดีมีคำถามเข้ามาเกี่ยวกับ BackgroundWorker เข้ามา แอดมินจะสรุปสั้นๆ BackgroundWorker นั้นมันเป็นคลาส ที่ช่วยให้เราสามารถแยกคำสั่งปฏิบัติการ (Operation) ไปบนเธรด (Thread) ใหม่ได้ เอ้า!!! เดี๋ยวจะงง หากใครที่เคยใช้ ProgressBar มา คงจะสังเกตเห็นว่าเราจะไม่สามารถขยับฟอร์มไปไหนได้เลย ก็เพราะว่ามันมีงานค้างอยู่ต้องทำให้เสร็จเรียบร้อยเสียก่อน หากจะให้อธิบายเรื่อง Thread มันเป็นเรื่องยาวมาก แอดมินอยากให้ทุกๆท่านได้นำโค้ดไปลองทดสอบดู เมื่อเห็นผลลัพธ์ ก็คงจะเข้าใจได้ไม่ยาก และนำเอาผลการปฏิบัติไปช่วยอ้างอิงเพื่อตีความหมายในหลักการทางทฤษฎี ซึ่งในตัว VB.NET มันมี Control ที่ชื่อว่า BackgroundWorker มาคอยช่วยจัดการเรื่อง Thread ให้เป็นที่เรียบร้อยแล้ว UHU ...
http://www.g2gnet.com/webboard/images/vbnet/backgrounddesign.png
Design Time
BackgroundWorker จะมี Events ที่สำคัญอยู่ 3 ตัว คือ
- Dowork ทำหน้าที่รันการปฏิบัติการแบบอยู่เบื้องหลัง หรือ Background Process
- ProgressChanged ทำหน้าที่รายงานความคืบหน้าของการปฏิบัติการที่ทำอยู่
- RunWorkerCompleted จะทำงานเมื่องานที่ทำอยู่นั้นเสร็จสิ้นสมบูรณ์
http://www.g2gnet.com/webboard/images/vbnet/backgroundnormal.png
ทดสอบการรันแบบธรรมดา
http://www.g2gnet.com/webboard/images/vbnet/backgroundworker.png
ทดสอบการรันแบบใช้ BackgroundWorker
มาดูโค้ดกันเถอะ ...
#Region "ABOUT"
' / --------------------------------------------------------------------------
' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
' / eMail : thongkorn@hotmail.com
' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
' / Facebook: https://www.facebook.com/g2gnet (For Thailand)
' / Facebook: https://www.facebook.com/commonindy (Worldwide)
' / Purpose: How to use The BackgrounderWorker.
' / Microsoft Visual Basic .NET (2010)
' /
' / This is open source code under @CopyLeft by Thongkorn/Common Tubtimkrob.
' / You can modify and/or distribute without to inform the developer.
' / --------------------------------------------------------------------------
#End Region
Public Class frmBackgroundWorker
Private Sub frmBackgroundWorker_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
TextBox1.Text = 100
TextBox1.MaxLength = 3
'// Initialized
With BackgroundWorker1
.WorkerReportsProgress = True
.WorkerSupportsCancellation = True
End With
'//
Control.CheckForIllegalCrossThreadCalls = False
End Sub
'// Background Worker Process
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
If Trim(TextBox1.Text) = "" Then Return
'//
BackgroundWorker1.RunWorkerAsync()
End Sub
'// BackgroundWorker - Events DoWork
Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
For i = 1 To 100
TextBox1.Text = i
BackgroundWorker1.ReportProgress(i)
Threading.Thread.Sleep(100)
lblProgress.Text = ProgressBar1.Value & "%"
Next
End Sub
'// When change occurs.
Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
Me.ProgressBar1.Value = e.ProgressPercentage
End Sub
'// When finished.
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
MessageBox.Show("Done Complete.", "Report Status", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
'// Normal Process
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
If Trim(TextBox1.Text) = "" Then Return
'//
Dim Max As Integer = 100
For i = 1 To Max
TextBox1.Text = i
lblProgress.Text = i.ToString & "%"
ProgressBar1.Value = (100 / Max) * i
Threading.Thread.Sleep(100)
Next
End Sub
' / --------------------------------------------------------------------------
' / Get numeric only.
Function CheckDigitOnly(ByVal index As Integer) As Boolean
Select Case index
Case 48 To 57 ' 0 - 9
CheckDigitOnly = False
Case 8, 13 ' Backspace = 8, Enter = 13
CheckDigitOnly = False
Case Else
CheckDigitOnly = True
End Select
End Function
Private Sub TextBox1_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
If e.KeyChar = Chr(13) Then
e.Handled = True
Call Button1_Click(sender, e)
Else
e.Handled = CheckDigitOnly(Asc(e.KeyChar))
End If
End Sub
End Class
ดาวนโหลดโค้ดฉบับเต็ม VB.NET (2010) ได้ที่นี่ ...
ขอบคุณครับผม:)
หน้า:
[1]