菜鸟学事件与委托(二)

                   大家在开发程序的时候经常会有子线程来更新主线程创建的窗体。有种偷懒的方法也是我以前经常用到的。

 VB.NET Code

 

Public   Sub   New ()

        
'  此调用是 Windows 窗体设计器所必需的。
        InitializeComponent()
        CheckForIllegalCrossThreadCalls 
=   False
        
'  在 InitializeComponent() 调用之后添加任何初始化。

End Sub

 

       在窗体默认的构造函数New下些上CheckForIllegalCrossThreadCalls = False,线程之间就可以随意调用了。这样是让线程不安全了。具体是啥不太懂。O(∩_∩)O哈哈~

再一次写程序的时候让人家好笑话,说我写的不正宗,靠,我貌似没有写过正宗的。但不甘心让人笑话决定自己写一次试试。在类ScanClass中我定义了一个事件。

 

Public   Event  SetText( ByVal  Sender  As  System.Object,  ByVal  e  As  System.EventArgs)

 

 

然后定义了SerialPort顺便写了被动接受事件:

 

 

代码
1  Private   Sub  myDataReceived( ByVal  sender  As  System.Object,  ByVal  e  As  System.IO.Ports.SerialDataReceivedEventArgs)
2           Dim  strTemp  As   String   =   ""
3          strTemp  =   Replace (mySerialPort.ReadExisting,  Chr ( 13 ),  "" )
4           If   InStr (strTemp,  Chr ( 13 ))  <>   0   Then
5              _sCode  =  strTemp
6               RaiseEvent  SetText( CType (strTemp  &   " , "   &  mySerialPort.PortName,  Object ), e)
7              mySerialPort.DiscardInBuffer()
8           End   If
9  End Sub

 

在这个被动接受的事件里我用RaiseEvent注册了要触发的类.然后再主窗体的执行事件中写一个订阅。

  Dim  newScan  As   New  ScanClass.ScanClass
 
AddHandler  newScan.SetText,  AddressOf  UIValue

 

上面这两句代码的意思是说当。被动接受激发后,执行UIValue这个方法。c#中就是

 

ScanClass.ScanClass newScan = New ScanClass.ScanClass();
newScan.SetText
+= UIValue;

 

 

假设我要在UIValue中更新一个TextBox值那么应该如下的做法。

 

  If  chcontrol.InvokeRequired  Then
  
Dim  del  As   New  mydelegate( AddressOf  UIValue)
  
Me .Invoke(del, sender.ToString)
 
Else
  chcontrol.Text 
=  sender.ToString
 
End   If

 

 

 好了,先到这里吧,下一篇看看委托实质。


你可能感兴趣的:(VB.NET)