2012-03-28 43 views
0

在我的應用程序'我從串行端口接收數據並將它們保存到兩個布爾陣列。
並取決於這些數組我設置複選框。但是,當我改變標籤....

這裏就是我怎麼做就行了(也許還有更好的辦法如何做到這一點)串行端口和複選框更新

private void comboBoxCommunication_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (serialPort.IsOpen) 
    { 
    recieveThread.Abort(); 
     serialPort.Close();    
    } 
    ComboBoxItem cbi = (ComboBoxItem)comboBoxCommunication.SelectedItem; 
    portCommunication = cbi.Content.ToString(); 
    serialPort.PortName = portCommunication; 
    try 
    { 
    serialPort.Open(); 
    recieveThread = new Thread(dataRecieving); 
     prijmiThread.Start();         
    checkBoxI1.IsChecked = vstupy[0] ? true : false; 
    checkBoxI2.IsChecked = inputs[1] ? true : false; 
    checkBoxI3.IsChecked = inputs[2] ? true : false; 
    checkBoxQ2.IsChecked = outputs[3] ? true : false;           
    } 
    catch (IOException ex) 
    { 
     MessageBox.Show(ex.ToString(), "Error!", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK); 
    } 
} 

private void dataRecieving() 
{ 
    if (serialPort.IsOpen) 
    {      
    int i = serialPort.ReadChar(); 
    if (i == 'A') 
    { 
     inputs[0] = true; 
    } 
     else if (i == 'a') 
     { 
     inputs[0] = false; 
    } 
    if (i == 'B') 
    { 
     inputs[1] = true; 
    } 
    else if (i == 'b') 
    { 
     inputs[1] = false; 
    } 
    if (i == 'C') 
    { 
     inputs[2] = true; 
    } 
    else if (i == 'c') 
    { 
     inputs[2] = false; 
    } 
    if (i == 'D') 
    { 
     outputs[0] = true; 
    } 
    else if (i == 'd') 
    { 
     outputs[0] = false; 
    }       
    }   
} 

回答

1

假設你綁推出複選框不僅更新一個線程,檢查串行端口,然後近乎實時地更新您的GUI,以便更改串行線程中可能需要做的事情。

  1. 當一個複選框改變狀態
  2. 的GUI可以訂閱這個事件你必須要知道錯扣的我會從串口讀取代碼引發事件。那就是你不能讓事件的處理程序直接更新獨立線程擁有的GUI元素。
  3. 因此,在您的事件處理程序中,您需要通過擁有的線程調用更新。

我寫了一個blog entry一次在Winform應用程序上處理跨線程的習慣用法。

我也不確定你的輸入數組是如何定義的,但總的來說,兩個線程在沒有某種控制機制的情況下訪問共享數據並不是一個好主意。如果您的數組基於原子讀/寫的數據類型,那麼它可能是正常的,但通常您需要考慮如果一個線程處於非原子寫入過程中,而另一個線程讀取或寫入相同數據時會發生什麼情況。您可能想要熟悉的線程安全性豐富。

+0

添加註釋:複選框不刷新,因爲您正在創建新線程,並且當您嘗試更改複選框時,從串口讀取的對象仍然具有相同的值。 – gbianchi 2012-03-28 17:45:59