2012-01-24 8 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私が兄を探していたことは...スタックに感謝しました。(pun :-)) –

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

Thanks Simon。感謝。 –

関連する問題