ここから本文です

C# テキストボックスへ数値の代入で質問です。初心者です。

god********さん

2018/8/217:49:07

C# テキストボックスへ数値の代入で質問です。初心者です。

下のプログラムで変数 STP の値をテキストボックスに表示したいのですが
textBox1.Text = Convert.ToString(STP);を下記の場所に置くと

System.InvalidOperationException: '有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'textBox1' がアクセスされました。'

と言われます。
何がいけないのか分かりません。ボタンクリックのイベントなどの中であれば問題なく動きます。どのようにすればよいのでしょうか。
何卒宜しくお願い致します。

private UInt16[,] data_word = new UInt16[1000,200];
private Byte[] RxData = new Byte[400]; // 受信バッファ
private UInt16 STP; //
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{

UInt16 work = 0;

serialPort1.Read(RxData, 0, 400);

work = 0;

for (UInt32 i = 0; i < 200; i++)
{
data_word[STP, i] = (UInt16)RxData[work + 1];
data_word[STP, i] = (UInt16)(data_word[STP, i] << 8);
data_word[STP, i] |= (UInt16)RxData[work];

work += 2;
}

STP++;

textBox1.Text = Convert.ToString(STP);

}

閲覧数:
151
回答数:
1
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

kkk********さん

2018/8/223:00:22

TextBoxとかComboBoxとか画面上に表示されるようなコントロール群はメインスレッドとかUIスレッドとか呼ばれるスレッドでしか操作できません。

SerialPort クラスのDataReceived イベントに対するハンドラはUIスレッドとは別のスレッドで実行されるために、UIコントロールであるTextBoxクラスのTextプロパティへ値を設定するところで例外が発生しています。

上記コードがWindowsFormsの場合

textBox1.Text = Convert.ToString(STP);

を以下のように変更します

this.Invoke(new MethodInvoker(() => textBox1.Text = Convert.ToString(STP));

WPFの場合は以下のようになります

this.Dispatcher.Invoke(new MethodInvoker(() => textBox1.Text = Convert.ToString(STP));

  • 質問者

    god********さん

    2018/8/310:49:48

    ありがとうございました、出来ました。

    下のような関数を別で宣言してDataReceivedの外で実行してみましたがこれもダメでした。受信完了確認用のデータ送信も2バイトだけじゃなくてたくさん送信しているようです。何か宣言の方法があるのでしょうか。受信完了の定義が終了したら下の仕事を1回だけやりたいのですが。図々しくてすみません。もしよろしければ教えて下さい。



    private void Serial_DataSend()
    {
    textBox1.Text = Convert.ToString(STP);

    TxData[0] = 0xAA;
    TxData[1] = 0x55;

    serialPort1.Write(TxData, 0, 2);
    }

  • その他の返信(2件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2018/8/6 09:36:18

早々かつ大変丁寧にご回答頂きました。誠にありがとうございました。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる