gpt4 book ai didi

c++ - 使用 WaitForMultipleObjects 时如何获取哪个对象超时?

转载 作者:太空宇宙 更新时间:2023-11-03 10:32:59 25 4
gpt4 key购买 nike

如果我正在使用 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;
}

最佳答案

WaitForMultipleObjects(...)WAIT_TIMEOUT 返回代码返回时,这表明您等待的对象在给定时间内都没有收到信号.

该函数本质上休眠您指定的超时时间,并且如果其中一个可等待对象在该时间之前收到信号,则只会提前返回。这意味着 WAIT_TIMEOUT 返回码与您等待的任何对象都没有关联。

Eregriths 的评论部分回答了您的第二个问题。要检查其他对象是否也收到信号,您可以再次调用 WaitForMultipleObjects(...),并根据您的需要,将超时值设置为 0(不要等待).当 WaitForMultipleObjects(...) 返回 WAIT_TIMEOUT 时,您知道在您调用时没有其他对象处于信号状态,但您应该记住,导致您第一次调用返回的对象可能会再次发出信号。因此,您可以将它从数组中排除,也可以使用 WaitForSingleObject(...) 函数简单地检查单个对象的状态。

如果您想确保所有对象都收到信号,您还可以使用 bWaitAll 参数。 WaitForMultipleObjects(...) 只有在所有对象都处于信号状态时才会返回。

希望对您有所帮助。

关于c++ - 使用 WaitForMultipleObjects 时如何获取哪个对象超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11048420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com