WaitForMultipleObjects
是 Windows API 中的一个函数,用于等待一个或多个对象变为信号状态或超时。这个函数常用于多线程编程中,以协调线程之间的操作。
函数原型
DWORD WaitForMultipleObjects(
DWORD nCount, // 对象的数量
const HANDLE *lpHandles, // 对象句柄数组
BOOL bWaitAll, // 等待所有对象还是任意一个
DWORD dwMilliseconds // 超时时间(以毫秒为单位)
);
参数说明
- nCount:
lpHandles
数组中的对象数量,不能超过MAXIMUM_WAIT_OBJECTS
(通常是64)。 - lpHandles: 一个包含要等待的对象句柄的数组。
- bWaitAll: 如果设置为
TRUE
,则等待所有对象都变为信号状态;如果设置为FALSE
,则只需其中任何一个变为信号状态即可返回。 - dwMilliseconds: 等待时间,如果设置为
INFINITE
,则无限期等待。
返回值
- 如果成功,它返回一个值,其中包含以下之一:
WAIT_OBJECT_0
: 所有指定的对象都已变为信号状态(当bWaitAll
为TRUE
时)。WAIT_ABANDONED
: 一些被等待的内核事件处于放弃状态,但在这种情况下仍然会返回,因此只有在特定情况下使用。- 更大的数字表示某个具体句柄被信号唤醒。
- 如果失败,则返回
WAIT_FAILED
。
示例代码
下面是一个简单示例,演示如何使用 WaitForMultipleObjects
:
#include <windows.h>
#include <stdio.h>
int main() {
HANDLE hEvents[2];
hEvents[0] = CreateEvent(NULL, FALSE, FALSE, NULL); // 创建第一个事件
hEvents[1] = CreateEvent(NULL, FALSE, FALSE, NULL); // 创建第二个事件
// 检查创建是否成功
if (hEvents[0] == NULL || hEvents[1] == NULL) {
printf("CreateEvent failed (%d)\n", GetLastError());
return 1;
}
// 启动新线程或其他操作使得某个事件可以被设置...
// 等待两个事件之一发出信号或者超时5000毫秒
DWORD result = WaitForMultipleObjects(2, hEvents, FALSE, 5000);
switch(result) {
case WAIT_OBJECT_0:
printf("First event signaled.\n");
break;
case WAIT_OBJECT_0 + 1:
printf("Second event signaled.\n");
break;
case WAIT_TIMEOUT:
printf("Timeout occurred!\n");
break;
default:
printf("Wait error (%d)\n", GetLastError());
break;
}
CloseHandle(hEvents[0]);
CloseHandle(hEvents[1]);
return 0;
}
注意事项
- 确保正确处理创建和关闭句柄,以避免资源泄漏。
- 在调用此函数之前,需要确保所有句柄都是有效的并且具有适当的权限。
希望这对你有所帮助!如果你还有其他问题,请随时问我。
内容由零声教学AI助手提供,问题来源于学员提问