Using the Windows WaitForMultipleObjects() and events

/* The following example uses the CreateEvent() function to create two event objects and the CreateThread() function

to create a thread. It then uses the WaitForMultipleObjects() function to wait for the thread to set the state of

one of the objects to signaled using the SetEvent() function. */

// For WinXp as a target, change appropriately
#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <stdio.h> 

// Global variable
HANDLE ghEvents[2];
// Prototype

DWORD WINAPI ThreadProc( LPVOID );

int wmain(void){
	HANDLE hThread;
	DWORD i, dwEvent, dwThreadID;
	wprintf(L"The current thread ID is: %d\n", GetCurrentThreadId());

// 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){
			wprintf(L"CreateEvent() #%d error: %d\n", i, GetLastError() );
			ExitProcess(0);
		}
		else{
			wprintf(L"CreateEvent() #%d is OK!\n", i);
		}
	}

// 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 ){
		wprintf(L"CreateThread() error: %d\n", GetLastError());
		return 1;
	}
	else
		wprintf(L"CreateThread() should be fine!\n"); 
	
// 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
						3000); // three-second wait
	
	wprintf(L"WaitForMultipleObjects() returns %d\n", dwEvent); 
	
// 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
			Sleep(3000);
			wprintf(L"First event was signaled...\n");
			break;
		// ghEvents[1] was signaled
		case WAIT_OBJECT_0 + 1:
			// TODO: Perform tasks required by this event
			Sleep(2000);
			wprintf(L"Second event was signaled...\n");
			break;
		case WAIT_TIMEOUT:
			wprintf(L"Wait timed out...\n");
			break;
		// Return value is invalid.
		default:
			wprintf(L"Wait error: %d\n", GetLastError());
			ExitProcess(0);
	}
	
	// Close event handles
	for (i = 0; i < 2; i++){
		CloseHandle(ghEvents[i]);
		wprintf(L"Closing the event handle #%d\n", 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])){
		wprintf(L"SetEvent() failed, error %d\n", GetLastError());
		return 1;
	}
	else
		wprintf(L"SetEvent() is pretty fine, one event was signaled!\n");
	
	wprintf(L"The current thread ID is: %d\n", GetCurrentThreadId());
	return 0;
}

Output example:

The current thread ID is: 5752

CreateEvent() #0 is OK!

CreateEvent() #1 is OK!

CreateThread() should be fine!

SetEvent() is pretty fine, one event was signaled!

WaitForMultipleObjects() returns 0

The current thread ID is: 1100

First event was signaled…

Closing the event handle #0

Closing the event handle #1

Press any key to continue . . .

猜你喜欢

转载自blog.csdn.net/chao56789/article/details/103612114