2012-02-24 3 views
0

안녕하세요 아직도 TabItem1을 선택한 경우에만 직렬 포트에서 6 바이트를 받고 싶습니다. 그리고 설정 체크 박스 상태는 바이트 ... 예에 따라 달라집니다하지만 그것은 작동하지 :직렬 포트, 확인란, 스레딩

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

를 호출해야합니다 수 있도록합니다.