2012-03-28 9 views
0

私のアプリではシリアルポートからデータを受信し、boolアレイに保存しています。
これらの配列に依存して、私はチェックボックスを設定しています。しかし、私はタブを変更する際のチェックボックスのみが更新されていません....

をここでは、打ち上げに抱き合わせていると仮定すると、シリアルポートとチェックボックスをアップデートする

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

(多分それを行うにはどのように良い方法があります)iは、それをdoinのだ方法ですシリアルポートをチェックして、シリアルスレッドに遭遇した変更にほぼリアルタイムでGUIアップデートを行うスレッド。おそらくいくつかのことを行う必要があります。

  1. チェックボックスが状態
  2. を変更したとき、私はシリアル読み取りコードからイベントを引き上げるGUIは、このイベントを購読することができしかし、あなたは、クロススレッドを認識する必要があり。つまり、イベントのハンドラに別のスレッドが所有するGUI要素を直接更新させることはできません。
  3. したがって、イベントハンドラでは、所有スレッドを介して更新プログラムを呼び出す必要があります。

私はblog entryをWinformアプリケーションのクロススレッド処理用のイディオムに一度書きました。

あなたの入力配列がどのように定義されているかもわかりませんが、一般的には2つのスレッドが何らかのタイプの制御メカニズムなしで共有データにアクセスすることはお勧めできません。あなたの配列がアトミックな読み込み/書き込みを行うデータ型に基づいている場合、それはOKかもしれませんが、通常、別のスレッドが同じデータを読み書きするときに、あるスレッドが非アトミックな書き込みの途中にある場合。おそらく慣れ親しんでいると思われる糸の安全性には、多くの素材があります。

+0

メモを追加する:新しいスレッドを作成しているためチェックボックスが更新されず、チェックボックスを変更しようとするとシリアルポートから読み取ったオブジェクトの値は変わりません。 – gbianchi

関連する問題