2014-03-19 5 views
0

으로 ManualResetEvent 뭔가를 구현하는 나를 놀라게하는 동안, 으로 ManualResetEvent (EventWaitHandle) 세트 WaitOne (시간 초과)보다 더 많은 CPU를 보낸다

지금까지 내가 mre.Set() 명령 신호를 이해하고 다른 프로세스가 실행 할 수있다.

mre.WaitOne(); 현재 라인을 유지하고 신호를 기다립니다. 시간 제한과 함께 사용하면이 옆에 mre.WaitOne(100ms);

그러나! StartCommunicate이 스레드의 작업이라고 가정 해 봅시다.

waitHandle.Set();을 사용하는 경우 내 프로세스가 ~ % 25 또는 다른 프로젝트 ~ % 1 CPU 리소스를 사용합니다.

그러나 waitHandle.WaitOne(100);을 사용하는 경우 (시간 초과 값은 기호입니다 (100ms 동안 신호를 기다립니다).

~ % 0 CPU 리소스를 사용하여 프로세스가 시작됩니다. waitone (시간 초과) 어떤 의미입니까? ThereAsAJobToExecute입니다. Socket.HasData입니다. 그렇다면 SerialPort.BytesToRead 또는 Socket.Available으로 CPU 사용률을 높이는 것이 좋습니다.

매 히트마다 100ms 동안 스레드를 유지하는 부작용이 있습니까? 소켓 프로그램이나 rs232 연결 전송 속도가 비교적 낮은 차세대 PC라고 가정합니다.

따라서 mre.WaitOne(1);을 사용하는 것이 나에게 더 좋습니다. 당신이 그것에 대해 어떻게 생각하십니까 ? 일부 메모리 및 성능 프로파일 러를 사용하여 몇 가지 실험을하고 있지만 다양한 클라이언트 시스템에 대해 최적의 솔루션을 수행하고 있는지 확실하지 않습니다 ...

의견을 기다리고 있습니다.

미리 감사드립니다.

ManualResetEvent waitHandle = new ManualResetEvent(false); 
    public void StartCommunicate() 
    { 
     while (true) 
     { 
      if (ThereIsAJobToExecute) 
      { 
       Execute the job here! 
      } 
      else { 
       //waitHandle.Set(); 
       waitHandle.WaitOne(1); 
      }        
     } 

    } 

편집 : 소켓이 작동 할 수 있습니다 프로그래밍을위한ASYN 그래서 우리는 아래의 코드에 의해 그것을 할 쉽게 할 수 있고 우리가 폴링을 필요가 없습니다.

하지만 RS232 COMM 포트 프로그래밍이 필요합니다. 안 그래요?

do 
{ 
     socket.BeginReceiveASYN(....ReceiveCallBack,...,socket) 
     mre.WaitOne(); 
     mre.Reset(); 
}while(true) 

    void ReceiveCallBack(IResult rst) 
    { 
    //get the socket and do my job here! 
     mre.Set(); 
    } 
+1

'Set()'과'WaitOne'은 거의 교환 할 수 없습니다. 이 사건에 왜 그들이 있다고 생각하는지는 나에게는 불분명하다. –

+0

일반적으로 'JobToExecute'를 생성하는 것은 신호를 처리합니다. 그것은 스레드 간 통신의 요점인데, 필요한 폴링은 없습니다. –

+0

@MartinJames 더 명확하게하기 위해 질문을 편집 할 것입니다. –

답변

1

은 스레드를 일시 중단 상태로두고 CPU 리소스를 소모하지 않습니다. 나중에 ManualResetEvent의 신호가 스레드를 깨 웁니다.

0

나는 ManualResetEvent을 사용하고있는 것이 100 % 명확하지 않습니다. 그러나 ...

waitHandle.WaitOne(1)과 같은 것을하는 것은 당신이 그 스레드에서 기다리고 있고 아무것도하지 않고있는 CPU 리소스를 소비하면서 매우 적은 시간 동안 자고 있기 때문에 무의미합니다.

당신이 깨어 있어야하고 프로세스 데이터는 다음이 같은 시도하는 것이 스레드에게보고하는 경우 : 그것을

while(true) 
{ 
    waitHandle.Wait(); 
    waitHandle.Reset(); 

    while(ThereIsAJobToExecute) 
    { 
    // Process the jobs 
    } 
} 

이는 아무 상관이 없을 때 잠을 스레드를 넣어 것, 그리고 자원을 낭비하지 않습니다. 이제 할 일이있을 때 waitHandle.Set()으로 신호를 보낼 수 있습니다.

+0

waitHandle의 상태가 false 인 경우 (waitone을 의미하는 경우) 코드가 작동하지 않는다고 생각합니다. 내가 기다렸던 기간을 기다렸다. 나는 방금 타이머 수면을했다. 나는 폴링의 CPU 과용을 피하기 위해이 작업을 수행했으며, 작업이없는 경우에만 작업을 수행했습니다. SYNC 작업이 있으면 작업을 완료하고 다시 폴링합니다. 그러나 조금 기다려서 다시 묻는 직업은 없습니다. "나에게 같은 질문을 자주하지 마십시오."와 같은 것입니다. 그것은 NOP보다 더 많은 시간이 걸립니다. 답하기 전에 의견을 읽었습니까? –

+0

이벤트가 신호되지 않으면 스레드는 신호가 발생할 때까지 잠자기 상태가됩니다. 잠자리 대신에 무엇을하고 싶습니까? 귀하의 질문은 귀하가하려는 일에 대해 분명하지 않으므로 최선의 추측을했습니다. – Sean

+0

폴링 작업이 있다고 가정합니다. 변경 사항에 대한 알림이 없습니다. 그런 다음 당신은 그것을 연속적인 반복으로 묻습니다. 그러나 직업이 있는지 없는지를 결정하는 데는 시간이 걸리므로이 변경을 자주 요청할 필요가 없습니다. BTW는 희소하게 IsThereAJobMethod-를 실행하지 않기 위해 CPU 리소스를 무료로 얻으라고 요청합니다. 나는 진짜로 계속하는 무슨을 이해하는 질문을 요청했다. 나는 David Haney가 옳다고 생각한다. –