thongkorn โพสต์ 2018-11-13 13:27:02

[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) ได้ที่นี่ ...

MrDen โพสต์ 2018-12-1 17:24:20

ขอบคุณครับผม:)
หน้า: [1]
ดูในรูปแบบกติ: [VB.NET] การใช้งาน Progress Bar ด้วย BackgroundWorker