2012-02-24 5 views
0

Привет, я хочу по-прежнему получать 6 байтов из последовательного порта только при выборе TabItem1. и установите флажки состояния зависит от того, что байт ... Примера: но он не работает:/Последовательный порт, флажки, Threading

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/или? Почему вы устанавливаете тег 'multithreading', ничего не известно об асинхронных операциях – sll

+0

Здесь' checkBoxI1.IsChecked = input [0] == 32? true: false; '.... i got _InvalidOperationException - вызывающий поток не может получить доступ к этому объекту, потому что ему принадлежит другой поток. –

ответ

1

Я думаю, что функция receiveData связана с SerialPort.DataReceived события. На самом деле это будет работать в другом потоке, чем ваш 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; 
})); 

Это переключит обратно к ГИП нити, чтобы сделать эти изменения и исключения должны исчезнуть.

Смежные вопросы