2012-03-29 2 views
2

확인. 2 COM 포트를 모니터링하는 프로그램이 있습니다. 하나는 저울에 연결되고 다른 하나는 모드 버스 보드에 연결됩니다.C# BackgroundWorker 및 Com 포트 문제

내 문제는 Modbus 보드에 연결된 COM 포트에 있습니다. 내 프로그램은 100MS마다 센서 (모듈 버스 보드에 있음)를 읽습니다. 센서가 차단되었는지 여부를 확인하기 위해 COM 포트를 통해 0 또는 1을 반환합니다. 차단 된 경우 신호가 포트를 통해 보드로 전송됩니다.

내 문제는 센서를 모니터링 할 수 없지만 다른 신호를 보내기 전에 com 포트가 사용 중이 아닌지 확인해야한다는 것입니다.

센서를 모니터링하는 루틴은 backgroundworker 스레드에 있습니다. 센서가 트립되면 다른 스레드가 생성되어 Modbus 보드에 신호를 보냅니다. 그래서 보드에 신호를 보내는 동안 "센서 스레드"를 일시 중지해야합니다. 이 일을 어떻게 하죠?

ThreadWork는 BackgroundWorker이므로 Thread.Join은 옵션이 아닙니다.

private void SensorThread_DoWork(object sender, DoWorkEventArgs e) 
    { 
     if (SensorThread.CancellationPending == true) 
      e.Cancel = true; 
     else 
     { 
      ReadSensor(); 
     }  
    } 

이 스레드에 대한 RunWorkerCompleted 그냥 스레드를 다시 시작합니다 :

여기 내 코드입니다. 모든 전송에 대한 책임을 단일 스레드를 만들고 그것을 루프

+3

이와 같은 작업을 위해 'BackgroundWorker'는 선택할 수있는 최악의 솔루션이라고 생각합니다. 'x' 초마다 모니터링 할 필요가있는 것이 있다면'while' 루프와'Thread.Sleep (x);를 가진 전통적인'Thread'가 훨씬 더 적합합니다 ... –

답변

4

을,

public void ScaleThread_DoWork(object sender, DoWorkEventArgs e) 
    { 
     if (ScaleThread.CancellationPending == true) 
     { 
      e.Cancel = true; 
     } 
     else 
     { 
      //sensor is blocked 
      if (sensorstatus == 0) 
      { 
       ReadScale(); 
       prevgate = gate; 
       gate = DetermineGate(); 
       //SaveData(); 
       SetOpenDelay(); 
       SetDuration(); 
       //no gate was selected, meat out of range, runs off end 
       if (gate == 0) 
       { 
        txtStatus.Invoke(new UpdateStatusCallback(UpdateStatus), new object[] { meatweight.ToString() + 
                        "lbs is out of range"}); 
       } 
       else 
       { 
        //this triggers a thread to send a signal to the modbus board 
        gateTimer.Start(); 
       } 
      } 
     } 
    } 

이의 RunWorkerCompleted이 스레드를 다시 시작 : 다음 스레드는 지속적으로 센서가 차단 될 때 볼 수있는 "sensorstatus"를 모니터링 작업. 장치에 보낼 메시지와 함께이 스레드를 공급하는 큐를 구현하십시오. 새로운 BlockingCollection<T>을 사용하면 쉽게 구현할 수 있습니다. http://msdn.microsoft.com/en-us/library/ee789351.aspx

지금 당신은 단순히 작업의 불이 장치에 전송할 수 있으며 순차적으로 실행됩니다 : - TPL을 사용

또는, 다음과 같이 하나의 병렬 처리의 제한 정도와 TaskScheduler를 만들 수 있습니다.

송신자와 독자간에 정보를 교환해야하는 경우가 아니면 독자적인 별도의 스레드에서 독자 작업을 구현합니다.