2013-01-02 98 views
0

我正在寫一個C#應用程序,通過串行通信到微控制器。關於如何處理收到的消息,我有幾個問題。下面是我目前使用的代碼,它收到的消息非常好,但我無法更新表單,或將數據存儲在此方法以外的任何位置(因爲它位於另一個線程中)。串行通信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()); 
     } 
    } 

當我試圖改變形式,或者從這裏這個調用另一個方法是我收到錯誤消息:「跨THEAD操作無效」。

我希望能夠在其他地方顯示信息,甚至更好地將其放入數組中,以便稍後將其存儲爲文件。有什麼辦法可以做到這一點?再次

謝謝!

回答

1

您需要調用使用InvokeBeginInvoke在主線程:

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()); 
    } 
} 

或者你可以將事件處理程序(如顯示一個消息框)的一部分,並援引代替。

+0

這完美地工作,謝謝!調用完成的是什麼? – Bubo

+0

@VRKnight它告訴主(GUI)線程執行你的代碼,而不是後臺線程。只有GUI線程才允許修改GUI(例如通過顯示消息框),所以這是必要的。 –

1

您遇到的問題是您嘗試從非ui線程更新UI。你需要做的是在UI線程上調用你的MessageBox調用。

喜歡的東西:

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); 
    } 
} 
+0

這兩個答案都起作用,這對於Invoke意味着什麼? – Bubo

+0

這裏有一點點閱讀,但基本上,它意味着在UI控件擁有或所屬的線程上執行所請求的代碼。在技​​術上,你可以在不調用(通過禁用調試器設置)的情況下做你想做的事情,但它不安全,所以調用確保跨線程正確執行。 http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx –