2012-06-19 6 views
4

У меня есть std::vector объектов ручек. Я должен ждать этих объектов дескриптора для использования в функции WaitForMultipleObjects. Поскольку это вектор, я получаю сообщение об ошибке при использовании его в WaitForMultipleObjects:Используйте std :: vector в WaitForMultipleObjects()

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

Есть ли способ сделать это?

+0

Как сказал @Joachim, вторым параметром должен быть указатель, так почему бы не отправить '& events [0]' вместо 'events'? –

ответ

3

Предпочтительно, если у вас есть до даты версии STL, вы должны использовать:

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

С старше STL, вы можете использовать & события [0], если .data() не является доступный как метод для вектора.

1

Если вы посмотрите на документацию для WaitForMultipleObject вы увидите, что второй аргумент является указателем , не std::vector. Класс std::vector не может использоваться вместо указателя или собственного массива.

Единственный способ, который вы можете сделать, это создать временный «массив» и скопировать все его ручки и использовать его как аргумент.

Другой способ, предложенный Чарльзом, заключается в использовании &vector[0] или, как предложил Тони, использовать vector.data() (при его наличии).

+1

Только путь? Что относительно '& events [0]'. –

+0

@CharlesBailey Это будет работать, но переносимо и «официально санкционировано» (т. Е. Определено стандартом)? –

+4

@JoachimPileborg, да, стандарт гарантирует, что элементы 'std :: vector' являются последовательными в памяти. – unkulunkulu

1

Вы должны сделать это как этот

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

Это портативный и-путь к сделай.

1

канонический способ добраться до основного вектора буфера

&events[0] 

Таким образом, вы можете сделать это:

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

Также см this similar question.