2012-04-02 4 views
0

私はDataReceviedHandlerを持っています。これはRxターミナルからデータを読み込んでいます。 Rx(DataReceviedHandlerから)でデータを取得した後にradioButtonのステータスを変更したいが、このエラーが発生する:「スレッド間操作が有効でない:Control 'radioButton3'がスレッド以外のスレッドからアクセスされているに作成されました。 解決するにはどうすればよいですか?C#2イベントハンドラは同じラジオボタンを制御します

おかげで、 オズ

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     m_ser.GetType(); 
     m_ser.PortName = "COM28"; 
     m_ser.BaudRate = 115200; 
     m_ser.Open(); 
     m_ser.ReadTimeout = 500; 
     m_ser.WriteTimeout = 500; 

    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    public void DataReceviedHandler(object sender, SerialDataReceivedEventArgs e) 
    { 
     byte[] m_rxUSBbuff = new byte[500]; 
     SerialPort sptemp = (SerialPort)sender; 
     UInt16 rxbuffLength = (UInt16)m_ser.BytesToRead; 
     byte[] rxBuff = new byte[rxbuffLength]; 
     try 
     { 
      rxbuffLength = (UInt16)sptemp.Read(rxBuff, 0, sptemp.BytesToRead); 
     } 
     catch (System.IO.IOException) 
     { 
      Console.WriteLine("Faild to Read from serial InputBuffer"); 
      return; 
     } 
     int i; 
     int m_rxUSBLstMsgLength; 
     m_rxUSBLstMsgLength = (UInt16)rxbuffLength; 
     for (i = 0; i < m_rxUSBLstMsgLength; i++) 
     { 
      m_rxUSBbuff[i] = rxBuff[i]; 
     } 
     switch (m_rxUSBbuff[0]) 
     { 
      case 1: 
       radioButton1.Checked = true; 
       break; 
      case 2: 
       radioButton2.Checked = true; 
       break; 
      case 4: 
       radioButton3.Checked = true; 
       break; 
      case 8: 
       radioButton4.Checked = true; 
       break; 
      case 16: 
       radioButton5.Checked = true; 
       break; 
      default: 
       break; 
     } 


    } 

    private void CheckLeds_Click(object sender, EventArgs e) 
    { 
      byte[] txb = new byte[1] { 0xf2 }; 
      m_ser.Write(txb, 0, 1); 
    } 


} 
+1

複数のスレッドがあるように見えるから - 関連するソースコードを表示してください... – Yahia

答えて

1

データは、バックグラウンドスレッドで到着すると、イベントハンドラが呼び出されるところでもあります。 UIエレメントは、作成したスレッド以外のスレッド(UIスレッド)から変更することはできません。このためにstackoverflowを検索すると、これを行う方法のヒープが見つかります。 WinformsではInvokeRequiredを使用し、WPFではUIディスパッチャーを呼び出す必要があります。 UIスレッドへのクリスが言うようにCross-thread operation not valid

+0

ありがとうございます、その作業 –

0

、元帥イベント、hereを参照してください。

この問題の答えの一つは、同様の質問へのリンクの全体の束が含まれています。さらに、任意のリソースが複数のスレッドに同時にアクセスされる可能性がある場合は、そのリソースをmutexの下に置きます。hereを参照してください。

関連する問題