2014-02-26 4 views
0

RS232 포트에서 데이터를 수신 할 serialPort1 개체가 있습니다. RS232에서 "finish"문자열을 얻을 때 tabControl1의 tabPage2를 선택하고 싶습니다. 이 코드는 내가하고 싶은 코드입니다.serialPort1의 receiveData 이벤트에서 C#의 tabControl1 tabPage2를 실제로 선택하는 방법은 무엇입니까?

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
     { 
      RxString = serialPort1.ReadExisting(); 

      if(RxString == "finish") 
      { 
       tabControl1.SelectedIndex = 1; 
      } 

      this.Invoke(new EventHandler(DisplayText)); 
     } 

나는 버튼 이벤트에 을 사용하면 내가 버튼을 클릭하면, 그것은 매우 잘 작동하지만 이벤트 "serialPort_DataReceived"에 넣을 때 나에게 오류 보여줍니다

오류가이다 " 크로스 스레드 작업이 유효하지 않음 : 생성 된 스레드가 아닌 다른 스레드에서 액세스 한 'tabControl1'제어. "

답변

1

serialPort1_DataReceived는 주 스레드가 아닌 보조 스레드에서 발생합니다. 크로스 스레드 작업을 수행하려면 델리게이트를 사용해야합니다. 아이디어를 얻는 샘플 코드는 다음과 같습니다.

// This delegate enables asynchronous calls 
delegate void SetIndexCallback(string text); 

    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 

    if (this.tabControl1.InvokeRequired) 
    { 
      SetIndexCallback d = new SetIndexCallback(SetText); 
     this.Invoke(d, new object[] { text }); 
    } 
    else 
    { 
     tabControl1.SelectedIndex = int(text); 
    } 
}