【问题标题】:How can I get which object timed out when using WaitForMultipleObjects?使用 WaitForMultipleObjects 时如何获取哪个对象超时?
【发布时间】:2012-06-18 09:22:30
【问题描述】:

如果我使用的是 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;
}

【问题讨论】:

  • 如果出现超时,是不是表示你等待的所有对象都没有应答?
  • 而对于你的第二个问题,如果一个对象发出信号,我猜你必须重新调用你的等待。

标签: c++ c winapi window


【解决方案1】:

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

该函数在您指定为超时的时间内基本上睡眠,并且仅在可等待对象之一在该时间之前发出信号时更早返回。这意味着WAIT_TIMEOUT 返回码与您等待的任何对象都没有关联。

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

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

希望能有所帮助。

【讨论】:

  • 哦,没看到是为数组而不是单个元素指定了超时,我的错,第二个问题呢?
猜你喜欢
  • 2016-05-14
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
相关资源
最近更新 更多