2012-02-24 17 views
0

こんにちは、シリアルポートから6バイトを受信したいのですが、TabItem1が選択されているときだけです。 そして、設定のチェックボックスの状態は、そのバイト... 例に依存しますが、それは動作していない:シリアルポート、チェックボックス、スレッディング

private void receiveData() 
{    
    for(int i = 0; i < 3; ++i)   
     inputs[i] = serialPort.ReadByte(); 
    for (int i = 0; i < 3; ++i)   
     outputs[i] = serialPort.ReadByte(); 

    checkBoxI1.IsChecked = inputs[0] == 32 ? true : false; 
    checkBoxI2.IsChecked = inputs[1] == 32 ? true : false; 
    checkBoxI3.IsChecked = inputs[2] == 32 ? true : false; 
    checkBoxQ1.IsChecked = outputs[0] == 32 ? true : false; 
    checkBoxQ2.IsChecked = outputs[1] == 32 ? true : false; 
    checkBoxQ3.IsChecked = outputs[2] == 32 ? true : false; 
} 
// Tab change 
private void tabControl1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (tabControl1.SelectedItem == tabItem1) 
    {          
     serialPort.Close(); 
     try 
     { 
      receiveThread.Abort(); 
     } 
     catch (NullReferenceException) 
     { 
     } 
    } 
    else if (tabControl1.SelectedItem == tabItem2) 
    {     
     serialPort.Open();     
     receiveThread = new Thread(receiveData); 
     receiveThread.Start();     
    } 
} 
+1

それではどうやって「うまくいきませんか」?どのような行動を取っていますか?これまでにどのようにデバッグしましたか?どのようなエラーメッセージが表示されますか? – Gray

+0

WPF/WinForms /または?なぜマルチスレッドタグを設定するのですか?非同期オペレーションについては何もありません – sll

+0

ここで 'checkBoxI1.IsChecked = inputs [0] == 32? true:false; '....私は_InvalidOperationExceptionを持っています - 別のスレッドがそれを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできません。 –

答えて

1

/私はreceiveData機能がSerialPort.DataReceivedイベントにバインドされていると思います。これは実際にGUIとは異なるスレッドで実行されます。そしてあなたはあなたのgui上の何かを変更して、問題を引き起こすのが好きです。この作品は、あなたが、多分これは、これらの変更を行うために戻ってGUIスレッドに切り替わり、例外がなくなってしなければならない

checkBoxI1.Invoke(new Action(() => 
{ 
    checkBoxI1.IsChecked = inputs[0] == 32; 
    checkBoxI2.IsChecked = inputs[1] == 32; 
    checkBoxI3.IsChecked = inputs[2] == 32; 
    checkBoxQ1.IsChecked = outputs[0] == 32; 
    checkBoxQ2.IsChecked = outputs[1] == 32; 
    checkBoxQ3.IsChecked = outputs[2] == 32; 
})); 

を呼び出す必要がありますようにする