2012-12-27 7 views
6

2 개의 프로젝트가 있습니다. 하나는 MFC 스타일이없는 C++ Builder에 의해 만들어졌습니다. 그리고 다른 하나는 VC++ MFC 11입니다.오디오가 꺼져있을 때 스레드가 느립니다.

스레드를 생성하고 사이클을 생성 할 때 -이 사이클은 progressbar 위치에 하나를 추가한다고 가정 해 봅시다 - Sleep(10)을 사용하여 1에서 100까지의 사이클은 C++ Builder와 C++ MFC.

이제 Sleep(10)은 10 밀리 초를 대기합니다. 승인. 그러나 문제는 내가 열린 미디어 플레이어, 윈앰프 또는 "사운드"를 생산하는 다른 것 밖에없는 경우입니다. 모든 미디어 플레이어, 윈앰프 및 기타 사운드 프로그램을 닫으면 내 스레드가 10 밀리 초보다 느려집니다.

50-100 ms/each이 필요합니다. 어떤 음악을 열면 정상적으로 작동합니다.

왜 이런 일이 발생하는지 전혀 알 수 없습니다. 처음에는 MFC App 내부에서 실수를했다고 생각했지만 C++ Builder는 왜 느려지 죠?

그리고 예, 나는 창문을 재구성하고 모든 것을 사용할 수 없기 때문에 소리와 관련이 있다는 것을 확실하게 확신합니다. 마지막으로 나는 그 소리 문제를 발견했다.

내 코드에 뭔가 필요한 것이 있습니까?

업데이트 :

지금, 나는 코드를 따라 내가 1 밀리 초를 기다려야 등의 분야에서 Sleep(1)를 사용하는 것을 발견했다. 그 이유는 객체를 왼쪽에서 오른쪽으로 이동시키기 때문입니다. 이 수면을 제거하면 매우 빨리 움직이기 때문에 움직이지 않습니다. 따라서 Sleep(1)을 사용해야합니다. Sleep(1)으로 오디오가 이고 인 경우 작동합니다. 오디오가 이면보다 매우 느립니다.

for (int i = 0; i <= 500; i++) { 
    theDialog->staticText->SetWindowsPosition(NULL, i, 20, 0, 0); 
    Sleep(1); 
} 

그래서, 이에 관한 제안은 정말 감사하겠습니다. 어떻게해야합니까?

나는 이것이 잘못된 방법이라는 것을 알고 있습니다. 적절하고 타당한 다른 것을 사용해야합니다. 그러나 정확하게 무엇? 정적 텍스트를 한 위치에서 다른 위치로 부드럽게 이동시키는 데 어떤 기능이나 클래스가 도움이됩니까?

또한 우선 순위의 스레드를 변경해도 도움이되지 않았습니다.

업데이트 2 :

업데이트 1은 또 다른 질문 : 적어도 10 밀리 초 동안

+0

흥미 롭군요. 차이점을 발견했을 때 프로세스의 우선 순위는 여전히 동일합니까? – Brad

+1

프로세스의 우선 순위는 같습니다. 두 번째 흥미로운 점은, 미디어 플레이어를 열었을 때 (음악을 재생하지 않으면) 내 스레드 프로그램이 CPU와 스레드의 2 %로 실행된다는 것입니다. 미디어 플레이어를 닫으면 즉시 느려지고 CPU 사용률은 0 %입니다. – xangr

+2

이것은 CPU의 빈도를 조절하는 프로세서 때문일 수 있습니다. – johnathon

답변

4

수면 (10)은 약 10 밀리 초를 기다립니다. 그 순간에 우선 순위가 높은 쓰레드가 실행되어야한다면, 쓰레드 깨우기가 지연 될 수 있습니다. 멀티미디어 스레드는 실시간 또는 높은 우선 순위에서 실행 중일 수 있습니다. 사운드를 재생할 때 스레드 웨이크 업이 지연됩니다.

은 7 장에서 마이크로 소프트 윈도우 (4 에드), 섹션 수면을위한 프로그래밍 응용 프로그램에서 제프리 Richters 주석을 참조하십시오

시스템이 지정된 밀리 초 약 번호에 대한 스레드가 스케줄되지 수 있습니다. 그렇습니다. 시스템에 을 100 밀리 초 동안 잠자기한다고 말하면 약 12 ​​초 또는 몇 분 더 오래 걸리는 약 수면을 취할 것입니다. Windows는 실시간 운영 체제가 아닙니다. 귀하의 스레드는 아마도 일어나야 할 것입니다,하지만 그것은 시스템에 계속되는 이 무엇인지에 달려 있습니다. MMCSS

MSDN Multimedia Class Scheduler Service (Windows) 당 또한

는 시간에 민감한 처리를 CPU 리소스에 우선 순위 액세스를 보장 받는다.

은 위의 문서에 따라, 당신은 또한 timeBeginPeriod()

Sleep() 타이밍의 최소 해상도가 설정되어
4

Sleep(10) 대기입니다. 실제로 기다린 시간을 확인하기위한 코드를 작성해야하며, 코드가 10 밀리 초를 초과하지 않는 경우 코드를 처리해야합니다. Windows는 실시간 운영 체제가 아닙니다.

+0

그가 이것을 알고 있다고 확신합니다. 문제는 퀀텀의 크기에 큰 영향을 미칠지 아니면 닥치는대로의 기회인지에 관한 것입니다. 또한 문제에 따라 "현명하게 처리하십시오."라는 질문은 단지 의문의 여지가 있습니다 (예 : 오디오 또는 비디오 재생). – Voo

+0

@Voo가 맞습니다. 나는 이것을 알고있다.내가 IDE를 설치 한 후에'SetSystemPowerState()'함수를 사용하여이 문제를 해결하려고 노력할 것이다. – xangr

+0

@Voo : 그는 진행률 표시 줄 위치를 업데이트하고 있습니다. 그것을 현명하게 다루는 것은 사실상 사소한 일입니다. –

2

시스템 전체 키 레지스트리를 통해, 우선 순위가 낮은 작업에 보장됩니다 CPU 리소스의 비율을 제어 할 수 있습니다 및 timeEndPeriod(). 예를 들어 timeBeginPeriod(1)을 전달하면 최소 해상도가 1ms로 설정됩니다. 오디오 프로그램이 해상도를 1ms로 설정하고 완료되었을 때이를 10ms 이상으로 복원 할 수 있습니다. 나는 Sleep(1)을 사용하는 프로그램에 문제가있었습니다. XE2 IDE가 실행 중일 때만 제대로 작동했지만 그렇지 않으면 12ms 동안 잠자기 상태였습니다. 내 프로그램의 시작 부분에 직접 timeBeginPeriod(1)을 설정하여 문제를 해결했습니다.

참조 : http://msdn.microsoft.com/en-us/library/windows/desktop/dd757624%28v=vs.85%29.aspx

관련 문제