문제

Windows 서비스 타이머에 대한이 질문 나를 생각하게했다 :

내가 기다리고있는 Windows 서비스를 가지고 있다고 말하면 Waithandle 그리고 깨어 났을 때, 그것은 아래의 흐름도에서 내가 보여준 것처럼 대기 스핀으로 뛰어 들었습니다.

스핀 다이어그램 http://www.86th.org/waitspin.jpg

타이머를 사용하는 것이 대기 스핀 루프 (때로는 스핀 웨이트라고도합니다). 솔직히 말해서, 나는 내 자신의 땜질 이외의 다른 것에 타이머를 사용한 적이 없습니다.

차이가 심오하고 타이머 사용의 이점이 놀랍지 않으면 전환 할 계획이 없습니다. 그러나 저는이 프로젝트의 향후 개발을 위해 다른 하나에 대한 사람들의 생각에 매우 관심이 있습니다.

이것이 위키가되어야하는지 알려주세요

도움이 되었습니까?

해결책

나는 당신이 타이머에서 어떤 혜택을 얻는 것을 보지 못합니다. 당신은 본질적으로 수면 통화로 타이머로 행동하고 있으며, 수면이 타임 슬라이스를 생산하기 때문에 대역폭 돼지가 아닙니다. 명시 적 타이머가 일어나서 전화하면 코드를 복잡하게 할 것입니다.

나는 일반적으로 스핀 웨이트를 잠들지 않는 것으로 생각하기 때문에 당신이 스핀 웨이트를하고 있다고 말하지 않을 것입니다. GO 신호를 기다리는 프로세서 시간이 모두 태워집니다.

다른 팁

실을 자고 타임 아웃으로 손잡이를 기다리는 것은 기본적으로 덮개 아래에서 같은 것입니다. 타이머는 본질적으로 수면을 사용하여 구현된다고 생각합니다. 다시 말해, 단일 루프의 시간 초과로 핸들을 대기하여 대기하여 별도의 대기 및 수면 루프를 구현하지 않고 대기가 릴리스 된 이유 (데이터 사용 가능 또는 시간 초과)를 확인하여 코드를 단순화 할 수 있습니다. 독립 루프보다 약간 더 효율적입니다.

이상적으로는 수면을 전혀 사용하지 않고 단순히 데이터 생성 코드에 의존하여 소비 코드가 기다리고있는 이벤트를 올바르게 높이고 이벤트 소스가 사라질 때 다루는 시간이 오래 걸립니다.

소켓 또는 기타 입력 장치와 같은 데이터가 외부 인 경우, 핸들은 일반적으로 데이터를 사용할 수 있도록 대기 할 수 있도록 설정 될 수 있습니다.이 경우 데이터가 준비되면 이벤트가 항상 신호를 보낼 필요가 없습니다. 소비를 위해.

우리는 스레드를 사용합니다. 그들은 타이머처럼 수행 할뿐만 아니라 스레드가 자고있는 동안 다른 작업을 수행 할 수있는 손잡이를 제공합니다.

나는 그것이 당신의 요구 사항에 달려 있다고 생각합니다.

  1. 작업을 실행하십시오 모든 5 분 (예 : 12:00, 12:05, 12:10, ...)
  2. 현재 작업을 완료하면 다음 작업을 실행하십시오. ~ 후에 5 분.

타이머와 스레드는 타이머와 스레드가 두 가지를 모두 수행 할 수 있지만 사례 1과 스레드에서는 쉬운 것처럼 보입니다.

사실, 비슷한 질문에 대해 더 긴 의견을 제시합니다 (사례 1에 대한 일부 고려 사항 포함).Windows 서비스 예약 실행).

폴링은 나쁘고 거의 항상 피할 수 있습니다. 때때로 사소한 것들에 대해서는 피하는 데 필요한 복잡성보다 덜 나쁘다.

"데이터가 있습니까?"에 대해 어떤 소스를 투표하고 있습니까? 당신은 어떤 종류의 핸들을 기다릴 수 없다고?

또한하지 마십시오 Sleep() 상당한 시간 동안 심각한 코드 (서비스와 같은). 당신이 할 수있는 유일한 차단은입니다 WaitFor[Single|Multiple]Objects(...) 핸들 목록에는 프로세스를 종료 할 때 해고되는 이벤트가 포함됩니다. 당신이 부르는 모든 곳을 찾으십시오 Sleep(millisec) 그리고 그것을 대체하십시오 WaitForSingleObjects(g_shutdownEvent, millisec).

Raymond Chen이 설명했듯이 "아 뭐 어쨌든." 당신이 얻는 방법을 알아낼 수 없다면 알림 데이터가 준비되면 SOL.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top