2012-01-24 3 views
0

어쩌면 내가 몸을 굽히고있다 ...하지만 사실은 스레딩과 관련하여 n00b가 조금있다 ...크로스 스레드가 클래스에서 호출합니까? 혼란 스러움 - vb.net

나는 클래스에서 직렬 포트를 사용하고있다. 나는 그 수업에서 나의 수업 형식으로 사건을 일으키고있다. 이벤트에 수신 된 데이터가 있습니다.

제기 된 이벤트에서 텍스트 상자를 채우고 싶습니다.

이제는 별도의 스레드를 만들지는 않았지만 UI에서 텍스트 상자를 업데이트하려고 할 때 정상적인 크로스 스레드 오류가 발생하므로 제 생각에 직렬 포트와 내부 메서드가 자체 스레드를 생성합니다. 에 관계없이.

, 나는

...

나는이 말이 희망 ... 제대로 인스턴스화 클래스의 스레드를 가리키는, 내 기본 폼에서, 인보을 구현하는 방법에 대한 조금 혼란 스러워요

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 스레드에 대한 호출을 마샬링해야 함을 의미합니다. System.Windows.Forms.Control의 Invoke 또는 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

내가 형제를 찾고 있었던 thats ... 고마워 스택 .. (말장난 의도 :-)) –

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

고마워요 사이먼. 감사합니다. –