2012-06-16 3 views
0

Sleep(sometime)은 일반적인 무한 윈도우 메시지 루프에서 용도로 사용됩니까 아니면 쓸모 없거나 유해합니까?Windows 메시지 루프에서 절전()?

일부 예제에는 Sleep이 포함되어 있지만 대부분은 그렇지 않습니다.

// Main message loop: 
    MSG msg; 
    while (GetMessage(&msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
     Sleep(500); // As pointed out below, completely nonsense 
     Sleep(5); // Would have been the better example, but still bad 
    } 

답변

4

그 전화는 무의미합니다. GetMessage은 대기열에 메시지가있을 때까지 대기하며, 그 동안 프로그램은 CPU를 차지하지 않습니다. 이미하는 일을하려고 할 필요가 없습니다.

이제 위험 할 수도 있습니다. (매우) 가능성이 있습니다! 대기열에 1000 개의 메시지가 있으면 500 초 동안 대기 상태가되어 모든 메시지를 처리 ​​할 수 ​​있습니다. 그 시간에 1000 개가 넘는 메시지를 축적하게 될 것입니다. 창문이 완전히 쓸모 없어지기까지 오래 걸리지 않을 것입니다. Windows는 많은 메시지를받습니다. 마우스가 움직일 때마다 반 시간을 기다리며 을 모두에 창문 너머로 보낼 것이라고 말해 주겠습니까?

또한 documentation에서 GetMessage은 오류가 있으면 -1을 반환합니다. -1은 0이 아니므로 루프가 메시지를 처리하려고 시도합니다. 더 올바른 방법 중 하나 핸들러에 넣어, 또는 완전히 종료 것 :

while (GetMessage (&msg, NULL, 0, 0) > 0) 
+0

"마우스가 창문 너머로 움직일 때마다 0.5 초 정도 기다리라는 반응을 보냅니 까?" 아니, 나는 단지 묻고있다 ;-) 예는 바보 같았다. 그러나 나는 이것을 몇몇 코드에서 발견했다. –

+2

@HorstWalter : 바보 같은 코드가 부족합니다. –

2

Sleep() 호출은 모두 완전히 쓸모 유해하다. GetMessage()은 창 중 하나에 대한 메시지가 준비 될 때까지 이미 잠자기 상태가됩니다. Sleep(500)을 추가하면 두 개의 메시지 만 초당 처리하기 때문에 창을 응답하지 않게됩니다.

1

Windows는 앱이 작동하지 않을 때 작동합니다. 기술에 대한 지식이 필요하지 않습니다. 게시 한 예제 코드는 전화가 울릴 때 작업중인 고객 서비스 담당자와 동일합니다. Sleep()을 삭제하십시오.