2012-03-28 4 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

(아마도 그것을 어떻게 더 나은 방법이) 뭐하는거야 방법
여기
이의 변경 때 체크 박스는 업데이트되지 않습니다 직렬 포트를 확인한 스레드는 직렬 스레드를 통해 발생하는 변경 사항에 거의 실시간으로 GUI 업데이트를 적용합니다.이 스레드는 여러 가지 작업을 수행해야 할 수 있습니다.

  1. 체크 박스 상태를
  2. 당신이 크로스 스레딩 알고 있어야 GUI는이 이벤트 에 가입하지만 수를 변경하면 나는 시리얼 읽기 코드에서 이벤트를 발생시킬 것이다. 즉, 이벤트의 핸들러가 별도의 스레드가 소유 한 GUI 요소를 직접 갱신하도록 할 수 없습니다.
  3. 따라서 이벤트 핸들러에서 소유 스레드를 통해 업데이트를 호출해야합니다.

Winform 앱에서 크로스 스레딩을 처리하는 관용구에 blog entry 한 번 썼습니다.

입력 배열이 어떻게 정의되어 있는지도 잘 모르겠지만 일반적으로 두 가지 스레드가 특정 유형의 제어 메커니즘없이 공유 데이터에 액세스하는 것은 좋지 않습니다. 배열이 원 자성 읽기/쓰기를 수행하는 데이터 유형을 기반으로한다면 OK 일 수 있지만 일반적으로 다른 스레드가 동일한 데이터를 읽거나 쓸 때 한 쓰레드가 비 원자 쓰기 작업의 중간에있는 경우 . 스레드 안전에 많은 자료가 풍부하여 익숙해지기를 원합니다.

+0

메모를 추가하려면 : 확인란을 변경하려고하면 새 스레드를 만들므로 확인란이 새로 고쳐지지 않으며 직렬 포트에서 읽는 개체의 값이 여전히 동일합니다. – gbianchi

관련 문제