如果我正在使用WaitForMultipleObjects,并且该函数返回WAIT_TIMEOUT,我怎样才能获得导致超时的对象?
我遇到的另一个问题是如果发出多个对象的信号,因为返回值只返回它检测到信号的第一个对象,如何获取其他信号的对象?
#include <windows.h>
#include <stdio.h>
HANDLE ghEvents[2];
DWORD WINAPI ThreadProc( LPVOID );
int main( void )
{
HANDLE hThread;
DWORD i, dwEvent, dwThreadID;
// Create two event objects
for (i = 0; i < 2; i++)
{
ghEvents[i] = CreateEvent(
NULL, // default security attributes
FALSE, // auto-reset event object
FALSE, // initial state is nonsignaled
NULL); // unnamed object
if (ghEvents[i] == NULL)
{
printf("CreateEvent error: %d\n", GetLastError() );
ExitProcess(0);
}
}
// Create a thread
hThread = CreateThread(
NULL, // default security attributes
0, // default stack size
(LPTHREAD_START_ROUTINE) ThreadProc,
NULL, // no thread function arguments
0, // default creation flags
&dwThreadID); // receive thread identifier
if( hThread == NULL )
{
printf("CreateThread error: %d\n", GetLastError());
return 1;
}
// Wait for the thread to signal one of the event objects
dwEvent = WaitForMultipleObjects(
2, // number of objects in array
ghEvents, // array of objects
FALSE, // wait for any object
5000); // five-second wait
// The return value indicates which event is signaled
switch (dwEvent)
{
// ghEvents[0] was signaled
case WAIT_OBJECT_0 + 0:
// TODO: Perform tasks required by this event
printf("First event was signaled.\n");
break;
// ghEvents[1] was signaled
case WAIT_OBJECT_0 + 1:
// TODO: Perform tasks required by this event
printf("Second event was signaled.\n");
break;
case WAIT_TIMEOUT:
// How can I get which object timed out?
printf("Wait timed out.\n");
break;
// Return value is invalid.
default:
printf("Wait error: %d\n", GetLastError());
ExitProcess(0);
}
// Close event handles
for (i = 0; i < 2; i++)
CloseHandle(ghEvents[i]);
return 0;
}
DWORD WINAPI ThreadProc( LPVOID lpParam )
{
// lpParam not used in this example
UNREFERENCED_PARAMETER( lpParam);
// Set one event to the signaled state
if ( !SetEvent(ghEvents[0]) )
{
printf("SetEvent failed (%d)\n", GetLastError());
return 1;
}
return 0;
}
答案 0 :(得分:8)
WaitForMultipleObjects(...)
返回时带有WAIT_TIMEOUT
返回码,表示您在指定的时间内没有等待的任何对象发出信号。
函数本质上 睡眠 指定为超时的时间,并且只有在此时间之前有一个可等待的对象发出信号时才返回更早。这意味着WAIT_TIMEOUT
返回代码与您等待的任何对象都没有关联。
Eregriths评论部分回答了你的第二个问题。要检查是否还发出了其他对象的信号,您可以再次调用WaitForMultipleObjects(...)
,并根据需要将超时值设置为0
(不要等待)。当WaitForMultipleObjects(...)
与WAIT_TIMEOUT
一起返回时,您知道在通话时没有其他对象处于信号状态,但您应该记住,导致您第一次呼叫返回的对象可以可能会再次发出信号。因此,您可以将其从数组中排除,或者只使用WaitForSingleObject(...)
函数检查单个对象的状态。
如果要确保所有对象都已发出信号,您还可以使用bWaitAll
参数进行播放。只有当所有对象都处于信号状态时,WaitForMultipleObjects(...)
才会返回。
希望有所帮助。