2011-02-25 3 views
1

EnumDisplayMonitor를 사용하여 시스템에 연결된 디스플레이에 대한 정보를 검색하고 있습니다. EnumDisplayMonitor를 호출하려면 각 열거 형 모니터의 세부 정보를 수신하기 위해 호출되는 콜백 함수가 제공되어야합니다. 내 질문은 언제 EnumDisplayMonitor 반환합니까? 즉시 또는 각 열거 형 모니터에 대해 콜백이 호출 될 때까지 차단합니까? 콜백에 의해 변경 될 데이터 구조를 처리하고 싶습니다. EnumDisplayMonitor 호출 후 즉시 수행하는 것이 안전한지 알아야합니다. 호출이 차단되지 않으면 콜백 호출이 완료되었는지 확인하는 방법이 있습니까? 콜백에 대한 일반적인 질문 일 수 있습니다 ....EnumDisplayMonitor는 언제 반환합니까?

예 :

BOOL CALLBACK MonitorEnumProc(
     __in HMONITOR hMonitor, 
     __in HDC hdcMonitor, 
     __in LPRECT lprcMonitor, 
     __in LPARAM dwData) 
{ 
    // Alter something here - e.g. Add lprcMonitor to a list.  
} 

int main() 
{ 
    EnumDisplayMonitor(NULL, NULL, MonitorEnumProc, 0); 

    // Can I rely on EnumDisplayMonitor to have finished making calls to 
    // MonitorEnumProc at this point? 
} 

은 내가 MSDN 항목을 확인했습니다 그리고이 점에서 도움이되지 않습니다 내가 실험에 의해 확인 것이지만, 나는 확실하게 테스트하기에 충분한 모니터를 필요가 없습니다.

답변

4

콜백 함수 호출이 끝나면 반환됩니다. 따라서 이벤트 순서는 다음과 같습니다.

Enter: EnumDisplayMonitor 
    Callback: MonitorEnumProc 
    Callback: MonitorEnumProc 
    Callback: MonitorEnumProc 
    ... 
Leave: EnumDisplayMonitor 

이 ilk의 모든 Windows API 루틴은 다음과 같이 작동합니다. EnumProcess, EnumWindows

코드는 스레드의 컨텍스트에서 실행되어야하며 이러한 열거 루틴이 즉시 반환되고 콜백을 비동기 적으로 호출해야하는 경우 코드가 스레드를 생성해야합니다. 당신은 여기에 최소한의 놀라움의 원칙을 적용 할 수 있습니다!

+0

감사합니다. 나는 대답이 일반적으로 적용될 것이라고 생각했다. – IronAsh

관련 문제