1

WaitForMultipleObjects を使用していて、関数が WAIT_TIMEOUT を返す場合、タイムアウトの原因となったオブジェクトを取得するにはどうすればよいですか?

もう 1 つの質問は、複数のオブジェクトがシグナル状態になっている場合です。戻り値は、シグナル状態として検出された最初のオブジェクトのみを返すため、シグナル状態の他のオブジェクトを取得するにはどうすればよいですか?

#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;
}
4

1 に答える 1

8

WaitForMultipleObjects(...)戻りコードで戻るときWAIT_TIMEOUT、それはあなたが待っていたあなたのオブジェクトのどれも与えられた時間内に合図されなかったことを示します。

関数は基本的に、タイムアウトとして指定した時間スリープし、待機可能なオブジェクトの1つがその時間より前に通知された場合にのみ、より早く戻ります。つまり、WAIT_TIMEOUT戻りコードは、待機しているどのオブジェクトにも関連付けられていません。

あなたの2番目の質問はEregrithsのコメントによって部分的に答えられています。他のオブジェクトも通知されているかどうかを確認するには、WaitForMultipleObjects(...)もう一度呼び出して、必要に応じて、タイムアウト値を0(待機しないでください)に設定します。WaitForMultipleObjects(...)戻ってきたときWAIT_TIMEOUT、呼び出し時に他のオブジェクトが信号状態になかったことを知っていますが、最初の呼び出しを返したオブジェクトが再び信号を送られる可能性があることに注意してください。したがって、配列から除外するか、WaitForSingleObject(...)関数を使用して単一のオブジェクトの状態を確認することができます。

すべてのオブジェクトが通知されていることを確認したい場合は、bWaitAllパラメーターで遊ぶこともできます。WaitForMultipleObjects(...)その後、すべてのオブジェクトが信号状態にある場合にのみ戻ります。、

それが少し役立つことを願っています。

于 2012-06-15T10:02:23.307 に答える