2011年10月3日 星期一

有關多執行緒與委派


跟大家分享一下
現在我做了一個主程式 Form1 程式如下(Form1上有一個ProgressBar1)
程式主要是從Class裡面引發事件,之後傳回值給主程式來利用
複製內容到剪貼板
代碼:

Public Class Form1
Dim WithEvents C As New Class1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       ProgressBar1.Maximum = 100
End Sub

Private Sub asdada(ByVal I As Int32) Handles C.EV
       ProgressBar1.Value = I
       'Me.BeginInvoke(New DelegateHelpBar(AddressOf ADD), New Object() {I})
End Sub
一個Class 程式碼如下
複製內容到剪貼板
代碼:

Public Class Class1
Public Event EV(ByVal S As Int32)
Private T As Timers.Timer
Private Count As Int32 = 0

Public Sub New()
       T = New Timers.Timer
       T.Interval = 1000
       AddHandler T.Elapsed, AddressOf T_Tick
       T.Enabled = True
End Sub

Private Sub T_Tick(ByVal sender As Object, ByVal e As Timers.ElapsedEventArgs)
       RaiseEvent EV(Count)
       Count += 1
End Sub
當你在VS2005裡面執行(debug)之後會有錯誤 "跨執行緒作業無效: 存取控制項 'ProgressBar1' 時所使用的執行緒與建立控制項的執行緒不同。"
不能執行,但是按下建置之後到Release的資料夾裡面直接執行"執行檔"之後,是可以動作的,可以看到ProgressBar1的值有在增加..
到這裡相關可以參考
http://forums.microsoft.com/msdn-cht/ShowPost.aspx?PostID=335818&SiteID=14
來了解為甚麼以及解法

另外,附帶一提,委派的作法(參考璉大的文章把Form1的程式改成如下,Debug就可以正常執行了)
原文http://forums.microsoft.com/msdn-cht/ShowPost.aspx?PostID=968617&SiteID=14
複製內容到剪貼板
代碼:

Public Class Form1

Dim WithEvents C As New Class1
Delegate Sub DelegateHelpBar(ByVal X As Int32)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       ProgressBar1.Maximum = 100
End Sub

Private Sub asdada(ByVal I As Int32) Handles C.EV
       Me.BeginInvoke(New DelegateHelpBar(AddressOf ADD), New Object() {I})
End Sub

Private Sub ADD(ByVal X As Int32)
       ProgressBar1.Value = X
End Sub

End Class

沒有留言:

張貼留言