有时我们会用到WaitForMultipleObjects()这个函数,在这里我们简单了解一下该函数的使用,先看函数原型:
HANDLE 句柄数组的指针。HANDLE 类型可以为(Event,Mutex,Process,Thread,Semaphore )数组
BOOL bWaitAll 等待的类型,如果为TRUE 则等待所有信号量有效再往下执行,FALSE 当有其中一个信号量有效时就向下执行
DWORD dwMilliseconds 超时时间 超时后向执行。 如果为WSA_INFINITE 永不超时。如果没有信号量就会在这死等。
函数功能:
WaitForMultipleObjects函数用于等待多个内核对象,前两个参数分别为要等待的内核对象的个数和句柄数组指针。如果将第三个参数bWaitAll的值设为TRUE,
等待的内核对象全部变成受信状态以后此函数才返回。否则,bWaitAll为0的话,只要等待的内核对象中有一个变成了受信状态,WaitForMultipleObjects就返回,
返回值指明了是哪一个内核对象变成了受信状态。当 bWaitAll参数为FALSE 可以等待其中之一的事件。
DWORD
WINAPI
WaitForMultipleObjects(
_In_ DWORD nCount,
_In_reads_(nCount) CONST HANDLE *lpHandles,
_In_ BOOL bWaitAll,
_In_ DWORD dwMilliseconds
);
nCount 句柄的数量 最大值为MAXIMUM_WAIT_OBJECTS(64)
HANDLE 句柄数组的指针。HANDLE 类型可以为(Event,Mutex,Process,Thread,Semaphore )数组
BOOL bWaitAll 等待的类型,如果为TRUE 则等待所有信号量有效再往下执行,FALSE 当有其中一个信号量有效时就向下执行
DWORD dwMilliseconds 超时时间 超时后向执行。 如果为WSA_INFINITE 永不超时。如果没有信号量就会在这死等。
函数功能:
WaitForMultipleObjects函数用于等待多个内核对象,前两个参数分别为要等待的内核对象的个数和句柄数组指针。如果将第三个参数bWaitAll的值设为TRUE,
等待的内核对象全部变成受信状态以后此函数才返回。否则,bWaitAll为0的话,只要等待的内核对象中有一个变成了受信状态,WaitForMultipleObjects就返回,
返回值指明了是哪一个内核对象变成了受信状态。当 bWaitAll参数为FALSE 可以等待其中之一的事件。
举例:
#include <iostream>
#include <Windows.h>
using namespace std;
int main()
{
//创建3个Event对象
HANDLE hEvent1 = CreateEvent(NULL, // 安全属性
FALSE, // 是否手动重置对象,为TRUE时等待事件后需手动重置,否则一直处于激发状态
NULL, // 是否初始化为激发状态
NULL // 名称
);
HANDLE hEvent2 = CreateEvent(NULL, TRUE, NULL, NULL);
HANDLE hEvent3 = CreateEvent(NULL, FALSE, NULL, NULL);
HANDLE hObject[3];
hObject[0] = hEvent1;
hObject[1] = hEvent2;
hObject[2] = hEvent3;
/// 激活所有对象
SetEvent(hEvent1);
SetEvent(hEvent2);
SetEvent(hEvent3);
/// 等待HANDLE数组中的所有对象,只有所有对象都被激活时才会返回
DWORD dwResult = WaitForMultipleObjects(3, hObject, TRUE, INFINITE);
switch (dwResult)
{
case WAIT_OBJECT_0:
cout << "所有对象都被激活" << endl;
break;
case WAIT_FAILED:
cout << "等待失败" << endl;
break;
default:
break;
}
/// 等待成功时,自动重置Event对象会重置Event状态,手动重置则不会,如此时hEvent1、hEvent3已被重置为未激发状态,hEvent2仍处于激发状态
/// 此时hEvent2已被重置,再次激活
SetEvent(hEvent3);
/// 等待多个对象中的某一个时,是按数组由前到后遍历,因此Event2、Event3均被激活的情况下,等待到的事件为Event2
dwResult = WaitForMultipleObjects(3, hObject, FALSE, INFINITE);
switch (dwResult)
{
case WAIT_OBJECT_0:
cout << "hEvent1被激活" << endl;
break;
case WAIT_OBJECT_0 + 1:
cout << "hEvent2被激活" << endl;
break;
case WAIT_OBJECT_0 + 2:
cout << "hEvent3被激活" << endl;
break;
case WAIT_FAILED:
cout << "等待失败" << endl;
break;
default:
break;
}
/// 手动重置Event对象
ResetEvent(hEvent2);
/// 再次等待,Event2处于未激发状态,等待到的事件为Event3
dwResult = WaitForMultipleObjects(3, hObject, FALSE, INFINITE);
switch (dwResult)
{
case WAIT_OBJECT_0:
cout << "hEvent1被激活" << endl;
break;
case WAIT_OBJECT_0 + 1:
cout << "hEvent2被激活" << endl;
break;
case WAIT_OBJECT_0 + 2:
cout << "hEvent3被激活" << endl;
break;
case WAIT_FAILED:
cout << "等待失败" << endl;
break;
default:
break;
}
/// 释放内核对象
CloseHandle(hEvent1);
CloseHandle(hEvent2);
CloseHandle(hEvent3);
system("pause");
return 0;
}