2013-08-27 6 views
0

직렬 포트와 통신해야하는 프로그램을 작성 중입니다. 내 주요 관심사는 충돌을 방지하고 동시에 다른 기능에서 쓰거나 읽지 않도록하는 것입니다.다중 스레드 간 코드 실행

처음에는 시스템 타이머가 처음부터 시작되어 주기적으로 직렬 포트에 데이터를 쓰고 주어진 시간 초과 값으로 응답을 수신하는 데 사용됩니다. 따라서 Elapsed 이벤트가 발생하고 작업을 수행합니다.

둘째, 다른 기능이 더 높은 우선 순위로 제공되며 직렬 포트에 데이터를 즉시 작성해야합니다.

시나리오 1 Elapsed 이벤트가 1 분마다 발생하고 이전 이벤트에서 보류 중이거나 SendImmediately 기능을 수행하지 않습니다.

시나리오 2 SendImmediately를 호출하는 경우 현재 실행중인 OnTimedEvent가 완료 될 때까지 기다려야합니다. 다시 한번, SendTermedEvent의 다음 실행은 SendImmediately가 완료 될 때까지 중지됩니다.

질문. 이전에 OnTimedEvent가 실행되기 전에 다음에 실행되지 않도록하려면 어떻게해야합니까? 아니면 SendImmediately가 끝나기 만합니까? 기본적으로 각각의 간섭을 방지합니다.

나는 약간의 Q를 겪었다. & A. 많은 제안 답변이 아래와 같이 있습니다

  • 비활성화 및 활성화 타이머
  • AutoResetEvent (2 방식으로 신호)
  • 으로 ManualResetEvent
  • Monitor.Enter/Monitor.Exit (잠금)
  • 수면/가입/작업 기다림 (차단)

난 고체가 없습니다. 각 시나리오가 다른 시나리오와 함께 제공 되었기 때문에 어느 시나리오가 적합한 지 또는 적절한 방법인지 결정하기 위해 필요합니다. 어떤 조언을 주셔서 감사합니다.

public System.Timers.Timer aTimer = new System.Timers.Timer(Properties.Settings.Default.Interval * 60 * 1000); 
    public bool InitialTimer(int interval, bool action) 
    { 
     aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
     aTimer.Interval = interval; 
     aTimer.Enabled = action; 
     GC.KeepAlive(aTimer); 
     return action; 
    } 

    public void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     // write something to serial port 
    } 
    public void WriteImmediately() 
    { 
     // write something to serial port 
    } 

답변

0

'SerialComms'스레드가 생성자 - 고객 대기열에서 시간 초과로 대기하도록하면됩니다. 대기열 시간이 초과되면 SerialComms는 폴링 시간 지정 작업을 수행 한 다음 대기열 대기 상태로 돌아갑니다. 더 높은 우선 순위의 thred가 포트에 무언가를 쓰고 싶다면, 그 메시지를 대기열에 넣을 수 있기 때문에, SerialComms 대기열은 시간 초과없이 '즉시'리턴을 기다리고 'SerialComms'코드는 버퍼의 쓰기를 수행 할 수 있습니다.

The high-priority writes are signaled onto the SerialComms thread 'immediately'. 
No explicit timer required. 
No possibility of the high-priority write interrupting an ongoing timed operation. 
No possibility of multiple timed operations stacking up or interrupting each other. 
Multiple high-priority writes can be queued up without any interference.