ホームページ > バックエンド開発 > C++ > C# のシリアル ポートから TextBox を安全に更新する方法?

C# のシリアル ポートから TextBox を安全に更新する方法?

DDD
リリース: 2025-01-23 02:13:07
オリジナル
315 人が閲覧しました

How to Safely Update a TextBox from a Serial Port in C#?

C# でシリアル ポートから TextBox を更新する際のクロススレッド例外を解決する

C# シリアル通信における一般的な問題には、serialPort1_DataReceived イベント ハンドラーからの TextBox の更新が含まれます。 シリアル ポートは別のスレッドで動作するため、このイベント ハンドラーから TextBox に直接アクセスすると、「クロススレッド操作が無効です」例外がスローされます。

この解決策には、TextBox のテキストを更新するためのスレッドセーフなメソッドが必要です。 これは、更新を UI スレッドにマーシャリングして戻すことで実現されます。 その方法は次のとおりです:

<code class="language-csharp">delegate void SetTextCallback(string text);

private void SetText(string text)
{
    if (this.textBox1.InvokeRequired)
    {
        SetTextCallback d = new SetTextCallback(SetText);
        this.Invoke(d, new object[] { text });
    }
    else
    {
        this.textBox1.Text = text;
    }
}</code>
ログイン後にコピー

この SetText メソッドは、現在のスレッドが UI スレッド (textBox1.InvokeRequired) であるかどうかを確認します。そうでない場合は、Invoke を使用して SetText コールバックを UI スレッドにマーシャリングし、スレッドの安全性を確保します。 それ以外の場合は、TextBox を直接更新します。

これを serialPort1_DataReceived イベント ハンドラーに統合する方法は次のとおりです。

<code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    string receivedData = serialPort1.ReadExisting();
    SetText(receivedData); // Use the thread-safe SetText method
}</code>
ログイン後にコピー

この改訂されたイベント ハンドラーはシリアル ポートからデータを読み取り、SetText メソッドを使用して TextBox を安全に更新し、クロススレッド例外を防ぎます。 このアプローチにより、UI の更新が常に正しいスレッドで実行されることが保証され、アプリケーションの安定性が維持されます。

以上がC# のシリアル ポートから TextBox を安全に更新する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート