0

シリアル経由でマイクロコントローラーと通信するC#アプリケーションを作成しています。受信したメッセージの処理方法についていくつか質問があります。以下は私が現在使用しているコードです。メッセージは完全に正常に受信されましたが、フォームを更新したり、このメソッド以外の場所にデータを保存したりすることはできません(別のスレッドにあるため)。

com.DataReceived += new SerialDataReceivedEventHandler(OnReceived);


public void OnReceived(object sender, SerialDataReceivedEventArgs c) // This is started in another thread...
    {
        com.DiscardOutBuffer();
        try
        {
            test = com.ReadExisting();
            MessageBox.Show(test);       
        }
        catch (Exception exc) 
        {
            MessageBox.Show(exc.ToString());
        }
    }

フォームを変更しようとしたり、ここから別のメソッドを呼び出したりすると、「CrossThead操作が無効です」というエラーメッセージが表示されます。

情報を他の場所に表示したり、さらに良い方法で配列に配置して、後でファイルとして保存したりできるようにしたいと思います。これを行う方法はありますか?

再度、感謝します!

4

2 に答える 2

1

Invokeまたはを使用してメインスレッドで呼び出す必要がありますBeginInvoke

public void OnReceived(object sender, SerialDataReceivedEventArgs c)
{
    if (this.InvokeRequired)
    {
        this.BeginInvoke(new EventHandler<SerialDataReceivedEventArgs>(OnReceived), sender, c);
        return;
    }

    com.DiscardOutBuffer();
    try
    {
        test = com.ReadExisting();
        MessageBox.Show(test);       
    }
    catch (Exception exc) 
    {
        MessageBox.Show(exc.ToString());
    }
}

または、イベントハンドラーの一部(メッセージボックスの表示など)を除外して、代わりに呼び出すことができます。

于 2013-01-02T19:33:32.433 に答える
1

あなたが抱えている問題は、UI以外のスレッドからUIを更新しようとしていることです。あなたがする必要があるのはMessageBox、UIスレッドであなたの呼び出しを呼び出すことです。

何かのようなもの:

public void OnReceived(object sender, SerialDataReceivedEventArgs c) // This is started in another thread...
{
    com.DiscardOutBuffer();
    try
    {
        test = com.ReadExisting();
        SetValue(test);       
    }
    catch (Exception exc) 
    {
        SetValue(exc.ToString());
    }
}


delegate void valueDelegate(string value);

private void SetValue(string value)
{   
    if (this.InvokeRequired)
    {
        this.Invoke(new valueDelegate(SetValue),value);
    }
    else
    {
        MessageBox.Show(value);
    }
}
于 2013-01-02T19:34:51.527 に答える