Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
7 / 7 / 2
Регистрация: 20.01.2011
Сообщений: 73
1

WSAWaitForMultipleEvents

21.02.2013, 15:05. Показов 2137. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
На МСДН пишут
WSAWaitForMultipleEvents Return value
C++
1
WSA_WAIT_EVENT_0 to (WSA_WAIT_EVENT_0 + cEvents - 1)
If the fWaitAll parameter is TRUE, the return value indicates that all specified event objects is signaled.

If the fWaitAll parameter is FALSE, the return value minus WSA_WAIT_EVENT_0 indicates the lphEvents array index of the signaled event object that satisfied the wait. If more than one event object became signaled during the call, the return value indicates the lphEvents array index of the signaled event object with the smallest index value of all the signaled event objects.
Объясните, пожалуйста, смысл WSA_WAIT_EVENT_0. Я так понял, это целочисленный индекс события в массиве событий, которые принимает WSAWaitForMultipleEvents. Так ли это? Что-то все-равно все в тумане...

Заране спасибо.

Добавлено через 25 минут
Гениально. Вообще перестал понимать.
Прошел по заголовочникам через дефайны вот что там.
C++
1
2
3
4
5
#define WSA_WAIT_EVENT_0 (WAIT_OBJECT_0)
....
#define WAIT_OBJECT_0 ((STATUS_WAIT_0) + 0)
...
#define STATUS_WAIT_0 ((DWORD)0x00000000)
Объясните пожалуйста эту чудесную магию. Зачем через три дефайна 0 протакивать и складывать с другими нулями. Лыжи вообще не едут =))
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.02.2013, 15:05
Ответы с готовыми решениями:

Описание функции WSAWaitForMultipleEvents
WSAWaitForMultipleEvents Если кто описывал енту функцию, дайте приз...или если она ужо опсана в...

[winsock] WSAWaitForMultipleEvents всегда возвращает WSA_WAIT_TIMEOUT
Проблема в том, что после подключения одного клиента друнгие клиенты не могут подключиться. Функция...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
21.02.2013, 22:05 2
WSA_WAIT_EVENT_0 - первый элемент в массиве. Потом от него идут другие индексы.
Обертки WSA_ для этих случаев - просто показывают, что значение применяется для вызовов WSA.

STATUS_WAIT_0 - это NTSTATUS.

А вообще все это костыли исторические. используй WSA_WAIT_EVENT_0 для WSA_WAIT_EVENT_0 WSAWaitForMultipleEvents
1
8 / 8 / 2
Регистрация: 04.12.2012
Сообщений: 130
22.02.2013, 00:28 3
Юрий Щупак -Win32 для профессионалов стр. 466:
Глава 9. Многозадачность
Функция WaitForMultipleObjects
Функция имеет следующий прототип:
C++
1
2
DWORD WaitForMultipieObjects(DWORD nCount. CONST HANDLE* lpHandles, 
BOOL fWaitAll. DWORD dwMi11iseconds);
Она работает так же, как и функция WaitForSingleObject, но при этом позволяет
ждать освобождения сразу нескольких объектов или какого-то одного объекта из
заданного списка.
Параметр nCount определяет количество интересующих вас объектов ядра. Его
значение должно быть в пределах от 1 до MAXIMUM_WAIT_OBJECTS. В заголовочных
файлах Windows эта константа имеет значение 64. Параметр lpHandles содержит
указатель на массив дескрипторов объектов ядра. В массиве могут содержаться
дескрипторы объектов разных типов.
Функция WaitForMultipleObjects приостанавливает поток и заставляет его ждать
освобождения либо всех заданных объектов ядра, либо одного из них. Параметр fWaitAll
определяет поведение функции. Значение TRUE задает режим ожидания
освобождения всех указанных объектов, a FALSE — только одного из них. В последнем случае код
возврата функции содержит информацию о том, какой именно объект освободился.
Возвращаемое функцией значение сообщает, почему возобновилось
выполнение вызвавшего ее потока. Значения WAIT_TIMEOUT и WAIT_FAILED
интерпретируются по аналогии с функцией WaitForSingleObject. Если параметр fWaitAll равен TRUE
и все объекты перешли в свободное состояние, то функция возвращает значение
WAIT_OBJECT_0. Если же fWaitAll имеет значение FALSE, то функция возвращает
управление, как только освобождается любой из объектов. При этом ее код возврата
лежит в интервале от WAIT_OB0ECT_O до WAIT_OBJECT_0 + nCount - 1. Иными
словами, если из кода возврата вычесть константу WAIT_OBJECT_0, то вы получите
индекс освободившегося объекта в массиве lpHandles.
Вот пример обработки кода возврата функции WaitForMultipleObjects:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
HANDLE hp[3]; 
hp[0] = hProcessO; 
hp[l] = hProcessl; 
hp[2] = hProcess2; 
DWORD dw = WaitForMultipleObjects C, hp. FALSE. 4000); 
switch (dw) { 
case WAIT_OBJECT_0 + 0: 
// завершился процесс с дескриптором hp[0] 
break; 
case WAIT_OBJECTJ + 1: 
// завершился процесс с дескриптором hp[l] 
break; 
case WAIT_OBJECT_0 + 2: 
// завершился процесс с дескриптором hp[2] 
break; 
case WAITJIMEOUT: 
// ни один из объектов не освободился в течение 4000 мс 
break; 
case WAITJAILED: 
// функция завершилась с ошибкой. 
break; 
}
1
7 / 7 / 2
Регистрация: 20.01.2011
Сообщений: 73
22.02.2013, 13:37  [ТС] 4
Цитата Сообщение от villu Посмотреть сообщение
WSA_WAIT_EVENT_0 - первый элемент в массиве.
Цитата Сообщение от popelyuk Посмотреть сообщение
При этом ее код возврата
лежит в интервале от WAIT_OB0ECT_O до WAIT_OBJECT_0 + nCount - 1.
Это просто, блин, гениально! В первых главах любого учебника по C++ рассказывается про массивы и про их индексацию. Про то что имя массива без [] является указателем на него и одновременно на его первый член, про арифметику указателей. Зачем так все усложнять и более того вписывать это в справку по своим библиотекам? И что самое забавное, что при компиляции WAIT_OB0ECT_O транслируется в
C++
1
((DWORD)0x00000000 + 0)
Спасибо всем за помощь. А то я думал, это у меня лыжи не едут, и в этой костанте хранится какая-то невероятная магия =))

Добавлено через 12 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
HANDLE hp[3]; 
hp[0] = hProcessO; 
hp[l] = hProcessl; 
hp[2] = hProcess2; 
DWORD dw = WaitForMultipleObjects C, hp. FALSE. 4000); 
switch (dw) { 
case 0: 
// завершился процесс с дескриптором hp[0] 
break; 
case 1: 
// завершился процесс с дескриптором hp[l] 
break; 
case 2: 
// завершился процесс с дескриптором hp[2] 
break; 
case WAITTIMEOUT: 
// ни один из объектов не освободился в течение 4000 мс 
break; 
case WAITFAILED: 
// функция завершилась с ошибкой. 
break; 
}
0
22.02.2013, 13:37
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru