CreateEvent、创建事件:
函数原型:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // NULL
BOOL bManualReset, // 人工复位
BOOL bInitialState, // 初始时的信号量
LPCTSTR lpName // 信号量名称
);
SetEvent,ResetEvent 分别将EVENT置为发信号与不发信号的状态。
配合使用WaitForSingleObject来等待事件触发,主要用在进程间简单的通信,只用于是否。
其中有四个参数:
第一个参数pEventAttributes 一般不用它,置为NULL。
第二个参数 BOOL bManualReset 。
为TRUE表示创建的event由人工复位,一旦Event被设置为有信号,则一直会等到ResetEvent()API被调用后,才会恢复为无信号。
设为FALSE,表示创建的event是自动复位。
第三个参数 BOOL bInitialState, 表示初始时的信号量有无,为TRUE 的时,表示有信号,反之无信号。
第四个参数LPCTSTR lpName , 信号量名称。
监测是否复位的方法是用waitForSingleObject探测该event的信号的有无,为TRUE 的时候,表示有信号,为FALSE为无信号。
EVENT是内核对象,Event被创建后,可以跨进程的用OpenEvent() 这个API来获得它的Handle,用CloseHandle() 可以关闭它,用SetEvent()或PulseEvent()来设置它的状态(只有开关两个状态),使其有信号;用ResetEvent() 来使其无信号,用WaitForSingleObject()或WaitForMultipleObjects()来等待其变为有信号。
返回值
If the function succeeds, the return value is a handle to the event object. If the named event object existed before the function call, the GetLastError function returns ERROR_ALREADY_EXISTS. Otherwise, GetLastError returns zero.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.
不要重复CreatEvent,即使重复CreatEvent,也会得到一个新的Handle,注意避免句柄泄漏。
#include "stdafx.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:
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[1]))
{
printf("SetEvent failed (%d)\n", GetLastError());
return 1;
}
return 0;
}
本文介绍了Windows操作系统中的事件对象(Event)的创建、管理及其在进程间通信中的应用。通过CreateEvent函数创建事件,参数包括手动复位或自动复位、初始状态等。SetEvent和ResetEvent分别用于设置和清除事件信号。使用WaitForSingleObject进行等待,OpenEvent用于跨进程获取事件句柄,CloseHandle用于关闭。当函数成功,返回事件对象的句柄,失败则返回NULL,并可通过GetLastError获取错误信息。
1848

被折叠的 条评论
为什么被折叠?



