1

私はスレッド化に非常に慣れていないため、これが競合状態であるかどうかはよくわかりません。C# の SerialPort クラスを使用して、シリアル デバイスからデータをクエリしています。インターネットを読んで理解したのは、データ受信イベントが発生したときに、このクラスが別のスレッドを生成するということです。これは、コントロールを作成したスレッドでしかコントロールを設定できないため、プログラムがイベント メソッドでテキスト ボックスの値を設定できないときに確認されたようです。私の問題は、テキストボックスの内容を設定する方法に競合状態が存在すると思うことです。

この方法の使用

private void btnWidth_Click(object sender, EventArgs e)
{
    mySerialManager.ClearErrorQueue();
    mySerialManager.WriteLine();
    Thread.Sleep(1000);

    if (mySerialManager.HasErrors())
    {
        MessageBox.Show("There was an Error Accessing the Serial Device:\n\r" + PrintAllErrors(mySerialManager), "Serial Device Error");
        return;
    }

    btnSubmit.Enabled = true;
    btnSubmit.Select();
    txtMeasWidth.Text = myRecievedData.Substring(0, myRecievedData.Length - 1).Trim();
}

データ コマンドをシリアル デバイスに書き込み、テキスト ボックスの内容を設定します。イベント ハンドラーは、発生すると myRecievedData 文字列の値を設定します。私の質問は、テキスト ボックスに書き込む前に、イベントが発生し、この文字列の値が設定されていることを確認する方法です。メソッドの最後で簡単な修正としてこれを行いましたが、これが競合状態である場合は確実に処理されるようにしたいと思います。

申し訳ありませんが、これは非常に長く続きます。助けてくれてありがとう!

4

2 に答える 2

2

競合状態があるのは正しいです。Invokeメソッドを使用して、SerialPortのイベントハンドラーからテキストボックスを安全に更新できます。

txtMeasWidth.Invoke((Action)delegate { txtMeasWidth.Text = myRecievedData; });
于 2012-06-21T19:19:17.787 に答える
1

はい、ここで競合状態を作成しています。
しかし、それは簡単に修正されます。

ComPortDataReceivedEventHandlerテキストボックスに適切なテキストを設定するメソッドを呼び出すだけです

例えば:

form.Invoke(new MethodInvoker(delegate() {textMeasWidth.Text = myreceivedData}))
于 2012-06-21T19:24:45.927 に答える