2013-05-21 92 views
0

我從一個串口接收數據,並以多行文本框中顯示的格式顯示所有收到的數據。這是我的串行監視器「txtOutput」。 將數據驗證爲完整消息並過濾掉了幾個字符(在單獨的類中)後,我需要將這些數據顯示到其他文本框(textBox7,2和6)。 出於某種原因,我無法理解,調試10到20秒後,連續發送消息(200-300 ms),我得到一個交叉線程錯誤,「跨線程操作無效:控制從訪問一個線程,而不是它創建的線程「。運行20秒後出現跨線程

這是我的代碼:

串口讀取

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
     { 
      try 
      { 
       SetText(serialPort1.ReadExisting()); 
      } 
      catch (Exception ex) 
      { 
       SetText(ex.ToString()); 
      } 
     } 

代表的setText

delegate void SetTextCallback(string text); 

接收串口數據,並闡述

private void SetText(string text) 
     { 
      if (this.txtOutput.InvokeRequired) 
      { 
      SetTextCallback d = new SetTextCallback(SetText); 
      this.BeginInvoke(d, new object[] { text }); 
      } 
      else 
      { 
       txtOutput.AppendText(text); 
      } 
       string a="", b="", c=""; 
        string invia = text.ToString(); 
        Stripper strp = new Stripper(); 
        strp.Distri(invia, out a, out b, out c); 
        textBox7.Text = a; // Current 
        textBox2.Text = b; //Temperature 
        textBox6.Text = c; //RPM 
       } 
      } 

這是一個我的第一個應用程序。 我需要更改哪些內容以避免交叉線程錯誤以及我犯的錯誤在哪裏?

回答

2

你已經有一些代碼改變了InvokeRequired保護的部分之外的UI元素。所有的文本框都需要保護。

試試這個:

private void SetText(string text) 
{ 
    if (this.txtOutput.InvokeRequired) 
    { 
     SetTextCallback d = new SetTextCallback(SetText); 
     this.BeginInvoke(d, new object[] { text }); 
    } 
    else 
    { 
     txtOutput.AppendText(text); 
     string a="", b="", c=""; 
     string invia = text.ToString(); 
     Stripper strp = new Stripper(); 
     strp.Distri(invia, out a, out b, out c); 
     textBox7.Text = a; // Current 
     textBox2.Text = b; //Temperature 
     textBox6.Text = c; //RPM 
    } 
}   
+0

賓果!它正在努力,因爲我試圖去獲得它。非常感謝。我的下一個問題是這些文本框中的數據只會在很短的時間內出現。一旦任何文本框出現新值,另一個文本框就會被取消。也許我應該就這個新問題開一個不同的問題。謝謝您的幫助。 – FeliceM

+0

@ FeliceM是的,一個新的問題是適當的。 –