拉入
BackgroundWorker元件
ProgressBar元件
BackgroundWorker 主要建立這三區段函式 有不同的作用
VB2008下拉入 BackgroundWorker元件後 只會自動產生一個區段
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
另外兩個需要自己補上
詳細可參考http://www.dotblogs.com.tw/billchung/archive/2009/05/29/8592.aspx
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
' 這裡的執行緒是不同於 form1的 執行緒
Dim receive_count As Integer
Do
'-----------------------------------執行緒背景循環工作---------持續接收COM----------------
'overtimeN = 1024
'Do Until nnn > overtimeN '測試循環條件
nnn = nnn + 1
If nnn > 1024 Then '循環背景BAR 每 1024 重複數
nnn = 0
End If
'--------若COM沒開>>> 去打開指定的COM-------------------------------------
If SerialPort1.IsOpen = False Then '若COM沒開>>> 去打開指定的COM
SerialPort1.PortName = passselcom 'Me.ComboBox1.Text 透過全區變數 從FORM1執行緒 傳遞給 目前執行緒
SerialPort1.Open()
End If
'--------/若COM沒開>>> 去打開指定的COM/-------------------------------------
'========================================================
If SerialPort1.IsOpen = True Then
' MsgBox(SerialPort1.PortName & "--->" & "OPEN OK")
SerialPort1.WriteLine("J")
' Threading.Thread.Sleep(0)
Try
'-------將接收到的資料串接在一起-----
receive_232data_all = receive_232data_all & SerialPort1.ReadLine & "," '讀出BUFFER現有行的資料字串 EX: AAAAA
'tt = tt & SerialPort1.ReadExisting '讀出BUFFER現有的資料字串 EX: A A A A A 每次讀會多一個空格 避免麻煩不採用此法
receive_count = receive_count + 1
'-------/將接收到的資料串接在一起/-----
' -----------------------'跳出循環條件 停止持續接收----------
If receive_232data_all.Length > 2046 Then
' MsgBox("receive_count = " & receive_count)
Exit Do
End If
' -----------------------'/跳出循環條件 停止持續接收/-----------
Catch ex As Exception '如果接收出錯 會有例外告知
MsgBox("receive_data too much BURST")
End Try
BackgroundWorker1.ReportProgress(CInt(nnn * 100 / 1024))
Else
' MsgBox(SerialPort1.PortName & "--->" & "OPEN FAIL")
End If
'==================================================
Loop
'----------------------------------接收循環結束--------關閉連線--------
If nnn = overtimeN Then
SerialPort1.Close()
' MsgBox(nnn)
End If
'----------------------------------/接收循環結束--------關閉連線/--------
End Sub
Public passselcom As String
Public receive_232data_all As String
Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
'這裡的執行緒是屬於form1的執行緒
passselcom = Me.ComboBox1.Text
ProgressBar1.Value = e.ProgressPercentage '回報進度BAR
' Me.TextBox1_com.Text = receive_232data_all
'-------------------
' If (SerialPort1.IsOpen = True) Then
' End If
'------------------------
'If SerialPort1.IsOpen = False Then
' MsgBox(SerialPort1.IsOpen.ToString)
' Me.TextBox1_com.Text = Me.TextBox1_com.Text.Length.ToString
'End If
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
'這裡的執行緒是屬於form1的執行緒
Me.TextBox1_com.Text = receive_232data_all '把RS232收集完成的數據資料從另一條執行緒 轉移過來form執行緒上輸出表格
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
passselcom = Me.ComboBox1.Text
' AddHandler Button3.Click, AddressOf Button2_Click
End Sub
End Class