vb.net的委托调用

 vb.net编程如果用多线程,因为无法传递函数指针,所以就存在了委托调用从而实现获得函数指针的作用:
在VB.NET中,一个委派是一个类型安全、面向对象的函数指针。

委托调用编程如下:


 '定义一个发送端‘更新进度条’的委托
    Public Delegate Sub UpdateSendCallBack(ByVal msg As String, ByVal SendNum As Integer)


 '发送端‘更新进度条’
    Public Sub UpdateSend(ByVal msg As String, ByVal SendNum As Integer)
        If  frmmainsl.ProgressBar1.InvokeRequired Then


            Dim d As New UpdateSendCallBack(AddressOf UpdateSend)
            frmmainsl.Invoke(d, New Object() {msg, SendNum})
        Else


            Me.Label3.Text = msg
            Me.ProgressBar1.Value = SendNum
        End If


总结:delegate声明一个委托——定义委托调用的函数。(委托和函数的参数要一致)


这样在其他线程中要实现更新季度条时要这样写:    frmmainsl.UpdateSend("第" & PacketNum + 1 & "包传送结束!", PacketNum + 1)




正规写法:


定义一个发送端‘更新进度条’的委托
    Public Delegate Sub UpdateSendCallBack(ByVal msg As String, ByVal SendNum As Integer)


   '发送端‘更新进度条’
     Private Sub UpdateSend(ByVal msg As String, ByVal SendNum As Integer)
                 Me.Label3.Text = msg
                  Me.ProgressBar1.Value = SendNum
      End If


这样在其他线程中要实现更新季度条时要这样写:       frmmainsl.Invoke(New UpdateSendCallBack(AddressOf UpdateSend), New Object() {"第" & PacketNum + 1 & "包传送结束!", PacketNum + 1})       




'=============================================================下面是转载========================================


[原帖地址]http://topic.csdn.net/u/20111019/17/ac098c48-ed25-4e1f-acd0-ec192ca44eac.html

  1. '原先错误的写法!  
  2. -------------------------  
  3. Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click  
  4.     Dim MyThread As New System.Threading.Thread(AddressOf sum)  
  5.     MyThread.Start()  
  6. End Sub  
  7. Private Sub sum()  
  8.     Dim i, sum As Integer  
  9.     For i = 0 To 100  
  10.         sum += i  
  11.     Next  
  12.     Me.Text = CStr(sum)  '在这里就会报错,教我"如何跨线程调用windows窗体控件",表示没看懂  
  13. End Sub  
  14. -------------------------------------  
  15. '正确的线程委托写法  
  16. -------------------------------------  
  17. Private Delegate Sub myDelegate(ByVal myString As String'自定义一个委托  
  18.   
  19. Private Sub SetWindowText(ByVal myString As String'与委托相同签名的函数或过程  
  20. Me.Text = myString  
  21. End Sub  
  22.   
  23. Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click  
  24. Dim MyThread As New System.Threading.Thread(AddressOf sum)  
  25. MyThread.Start()  
  26. End Sub  
  27.   
  28. Private Sub sum()  
  29. Dim i, sum As Integer  
  30. For i = 0 To 100  
  31. sum += i  
  32. Next  
  33. Me.Invoke(New myDelegate(AddressOf SetWindowText), sum.ToString) '委托的调用  
  34. End Sub  

 
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页