2012-01-24 50 views
0

也許我正在彎腰......但事實是,我有點線程n00b ...跨線程從類中調用?困惑 - vb.net

我正在使用類中的串行端口。我正在從這個班級向我的表格提出一個事件,稱爲班級。事件包含收到的數據...

我希望簡單地從引發事件中填充文本框。

現在我沒有專門創建一個單獨的線程,但是當我嘗試在UI上更新我的文本框時遇到了正常的crossthreading錯誤,所以我的假設是串行端口及其內部方法可能會創建它自己的線程。 。

無論如何,我有點困惑,如何正確實現的調用,從我的主要形式,指着實例化的類不知所云,

我希望這是有道理的......

Dim WithEvents tmpRS232 As New clsRS232

Private Sub but_txt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles but_txt.Click 
    tmpRS232.Set_com_port("COM8", 38400) 
    tmpRS232.Transmit_data(txt_tx.Text) 
End Sub 

Private Sub tmprs232_rx_data_returned(ByVal str_data As String) Handles tmpRS232.rx_data_returned 
    txt_rx.Text = str_data 'Cross threading error 
    MsgBox(str_data) 'Fires without errors 
End Sub 

有人可以提供基於此代碼的代碼示例嗎?

謝謝。

+0

您不能從沒有UI線程修改UI [如何更新從C#另一個線程GUI] [1] [1] :http://stackoverflow.com/questions/661561/how-to-update-gui-from-another-thread-in-c – Andrew

+0

嗯,我知道......只是不確定在這種情況下「如何」調用... –

回答

5

你是對的,這裏的問題是你正試圖從非UI線程(在本例中是串口處理程序)更新UI元素。你需要做的是檢查你試圖從回調中訪問的控件是否設置了InvokeRequired標誌。如果是這樣,這意味着你需要編組你的調用UI線程。您可以通過使用Invoke或從System.Windows.Forms.Control的BeginInvoke實現此目的。

Private Delegate Sub SetRxTextCallback(ByVal [text] As String) 

Private Sub SetRxText(ByVal [text] As String) 
    txt_rx.Text = [text] 
End Sub 

Private Sub tmprs232_rx_data_returned(ByVal str_data As String) Handles tmpRS232.rx_data_returned 

    If (txt_rx.InvokeRequired) Then 
     Dim d As New SetRxTextCallback(AddressOf Me.SetRxText) 
     Me.BeginInvoke(d, New Object() {[str_data]}) 
    End If 

    'txt_rx.Text = str_data 'Cross threading error 
    'MsgBox(str_data) 'Fires without errors 
End Sub 

下面是MSDN文檔的鏈接,詳細解釋它。

+0

多數民衆贊成我正在尋找兄弟...謝謝一堆...(雙關語意:-)) –

2

或者乾脆...

Private Sub tmprs232_rx_data_returned(ByVal str_data As String) Handles tmpRS232.rx_data_returned 
    If InvokeRequired Then 
     Invoke(Sub()txt_rx.Text = str_data) 
    Else 
     txt_rx.Text = str_data 
    End If 
End Sub 
+0

謝謝西蒙。讚賞。 –