2010-05-31 4 views
1

윈도우 OS에서 스레드를 최대 100.8564 밀리 초로 줄이는 방법이 있습니다. 멀티미디어 타이머를 사용하고 있지만 해상도는 최소 1 초입니다. 밀리 초의 분수 부분을 처리 할 수 ​​있도록 안내해주십시오.Sleep thread 100.8564 millisecond in C++ window plateform

+0

동일한 사용자가 http://stackoverflow.com/questions/2927448/sleep-function-error-in-c에 속함. –

+0

@Neil : 읽으면이 문제는 가리키는 것과 중복되지 않습니다. 문제는 잠자기 기간으로 10 진수로 잠을 자도록하는 것입니다. – Kangkan

+3

왜 그렇게 정확한가요? 분명히 100.8565 밀리 초가 괜찮을 것입니다. – Puppy

답변

5

네, 할 수 있습니다. 정확한 시간을 읽고 바쁜 루프를 만들려면 QueryPerformanceCounter()를 참조하십시오.

이렇게하면 최대 10 나노초까지 대기 할 수 있습니다. 그러나 스레드 스케줄러가주기 종료 순간에 사용자로부터 제어권을 훔치기로 결정하면 할당을 제외하고는 아무 것도 할 수 없습니다 귀하의 프로세스 실시간 우선 순위. http://msdn.microsoft.com/en-us/library/ms838340(WinEmbedded.5).aspx

여러 프레임 워크가 창에 하드 실시간을 위해 개발되었습니다 :

는 또한 이것 좀있을 수 있습니다.

그렇지 않으면 귀하의 질문이 아마도 당신이 뭔가 잘못하고있을 수도 있음을 의미합니다. 적절한 버스 드라이버 (하드웨어/IO의 경우 또는 드라이버를 설계 할 경우 각각의 DMA)를 사용하는 것과 같은 정확한 지연을 필요로하는 수많은 메커니즘이 있습니다.

정확하게 건물을 알려주십시오.

+0

사실 저는 실시간 응용 프로그램을 개발 중입니다. 밀리 초의 분수 부분조차 무시할 기회가 없으므로 출력이 끝날 때 그 결과가 매우 손상됩니다. – Siddiqui

+2

@Arman이 정도 많이 추측했습니다 :) 어떤 응용 프로그램입니까? 무엇을 해야하는지? 왜 출력 타이밍이 중요한가? 매 시간마다 중요하거나 시간의 일정 비율 오류가 있습니까? 왜냐하면 내가 작성한 것은 UI를 비롯하여 UI를 비롯한 일부 UI 프로세스 (RP), 커널 모드 코드가 간섭 할 수있는 등 시스템의 다른 것들에 의존 할 수 있기 때문입니다. 정확히 어떤 임무입니까? –

+0

서브 밀리 초 지터로 인해 물리적 손상이 발생할 수있는 경우, 출력을 제어하기 위해 전용 하드웨어 (MCU 또는 FPGA 기반)를 사용하는 것이 좋습니다. 워치 독 타이머 및 기타 안전 연동 장치를 해당 출력 제어 보드에 통합 할 수도 있습니다. 상위 레벨 제어에만 Windows 시스템을 사용하십시오. 또는 고해상도 타이머에 액세스 할 수있는 플랫폼에서 실시간 OS로 이동하여 자신의 인터럽트 서비스 루틴을 작성할 수 있습니다. –

3

귀사의 유스 케이스는 잘 모르겠지만 하이 엔드 리얼 타임 운영 체제조차도 타이밍에 대해 100ns 이하의 지터를 달성하기는 어려울 것입니다.

대부분의 경우 재현성에서는 정밀도가 필요하지 않지만 오랜 시간 드리프트에만 필요하다는 것을 알았습니다. 이러한 측면에서 타임 라인을 유지하고 원하는 정밀도로 이벤트를 계산하는 것은 비교적 간단합니다. 그런 다음 해당 타임 라인을 사용하여 10 분의 1 ms까지 벗어날 수있는 이벤트를 동기화합니다. 이러한 오류가 합쳐지지 않는 한 적절한 성능을 얻었습니다.

2

멀티미디어 타이머의 해상도는 1 초보다 훨씬 깁니다. timeBeginPeriod (1)를 먼저 호출하면 1 밀리 초까지 내려갈 수 있습니다. 콜백이 늦게 전달되면 타이머는 자동으로 다음 호출 간격을 조정합니다. 멀티 태스킹 운영 체제에는 필연적 인 일이지만 항상 우선 순위가 높은 일종의 커널 스레드가 콜백을 지연시킬 수 있습니다.

평균적으로 잘 작동하지만 최악의 대기 시간은 수백 밀리 초입니다. 분명히, 당신의 요구 사항은 Windows에 의해 장거리에서 충족 될 수 없습니다. 그런 종류의 실행 보증을 제공하려면 일종의 마이크로 컨트롤러가 필요합니다.

3

대기 시간을 보장해야하는 경우 MS Windows를 사용할 수 없습니다. 실시간 운영체제가 아닙니다. 다른 스레드 또는 프로세스에서 가져 오기 순간에 스왑 될 수 있습니다. 캐시 미스가 발생할 수 있습니다. 내가 잠시 로봇 컨트롤러를 만들었을 때, On Time RTOS 32라는 OS를 사용했다. MS Windows API 에뮬레이션 레이어가있다. Visual Studio에서 사용할 수 있습니다. 당신은 그런 것이 필요할 것입니다.