2012-06-19 3 views
4

나는 핸들 객체가 std::vector입니다. WaitForMultipleObjects 함수에서 사용할 객체를 처리 할 때까지 기다려야합니다.WaitForMultipleObjects()에서 std :: vector 사용

std::vector<HANDLE> events; 
// ... 
WaitForMultipleObjects(events.size(), events, true, INFINITE); 

이 작업을 수행 할 수있는 방법이 있습니까 : 그것은 벡터이기 때문에 WaitForMultipleObjects에서 그것을 사용하는 동안, 나는 오류는 무엇입니까?

+0

@Joachim이 말했듯이 두 번째 매개 변수는 포인터 여야하므로'events '대신'& events [0]'을 보내지 않으시겠습니까? –

답변

3

바람직하게는, 당신은 STL의 최신 버전으로까지있어, 당신은 사용해야합니다 : 나이가 STL의와

WaitForMultipleObjects(events.size(), events,data(), true, INFINITE); 

, .DATA()가 아닌 경우 & 이벤트 [0]을 사용할 수 있습니다 벡터의 메서드로 사용할 수 있습니다.

1

WaitForMultipleObject에 대한 설명서를 보면 두 번째 인수가 포인터이고 std::vector이 아니라는 것을 알 수 있습니다. std::vector 클래스는 포인터 또는 기본 배열 대신 사용할 수 없습니다.

유일한 할 수있는 방법 중 하나는 임시 "배열"을 만들고 모든 핸들을 복사하여 인수로 사용하는 것입니다.

찰스가 제안한 또 다른 방법은 &vector[0]을 사용하거나(사용 가능한 경우)을 사용하는 Tony의 제안에 따르는 것입니다.

+1

유일한 방법은? '& events [0]'은 어떨까요? –

+0

@CharlesBailey 작동 할 것이지만 이식성이 있으며 "공식적으로 승인"됩니까? –

+4

@JoachimPileborg, yes, standard는'std :: vector'의 원소가 메모리에서 연속적으로 존재 함을 보장합니다. – unkulunkulu

1

당신은이 휴대용과 방향 - 투 - 할 - 그것입니다이

WaitForMultipleObjects(events.size(), &events[0], true, INFINITE); 

같이해야한다.

1

기본 벡터 버퍼에 얻을 수있는 표준 방법은

&events[0] 

그래서 당신이 할 수 있습니다 :
WaitForMultipleObjects(events.size(), &events[0], true, INFINITE); 

는 또한 this similar question를 참조하십시오.