Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

Serial受信中にテキスト表示 解決済み

SerialPort UIスレッド スレッドアフィニティ 非同期 タグの編集...

投稿者 素人   (学生)   投稿日時 2019/6/18 10:36:23
Serialポートを使用してデータの受信を行っています。

◆実現したいこと
例えば、
受信データが"A"だった場合は、TextBox11.Text="正常"
受信データが"B"だった場合は、TextBox11.Text="異常"  と表示させたいです。

◆今の状況
Serialポートを使用してデータの受信はできました。
しかし、SerialPort1_DataReceivedイベントないで、TextBox11.Textの表示をさせようとしたところ、次のエラーが出てしまい、エラーの内容と原因が分からず困っております。

◆エラーメッセージ
System.InvalidOperationException
  HResult=0x80131509
  Message=有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'TextBox11' がアクセスされました。

◆試しているコード
   Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

        If SerialPort1.IsOpen = False Then
            Return
        End If
        TextBox11.Text = "テスト中"
        Try
            Dim data As String
            data = SerialPort1.ReadExisting()

            Invoke(New Delegate_RcvDataToTextBox(AddressOf Me.RcvDataToTextBox), args)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

    End Sub

投稿者 魔界の仮面弁士   (社会人)   投稿日時 2019/6/18 14:17:57
DataReceivedイベントが動作するスレッドは、UI スレッドではありません。
それぞれ別のスレッドなので、通信中にフォームのコントロールなどを
直接操作することは禁じられています。

(案1)SynchronizationContext クラスを用いて、各スレッドの処理を同期させる
https://devlights.hatenablog.com/entries/2009/03/19

(案2) Invoke/BeginInvoke メソッドを通じて、コントロールに対して処理を依頼する
https://www.atmarkit.co.jp/ait/articles/0506/17/news111.html

投稿者 素人   (学生)   投稿日時 2019/6/18 15:48:16
案2で解決することができました。
ありがとうございました。