HANDLE WINAPI CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset, // TRUE = 手动复位,FALSE = 自动复位
BOOL bInitialState, // TRUE = Singled,FALSE = Unsingled
LPCTSTR lpName
);
一个Event被创建以后,可以用OpenEvent来获得它的Handle,用CloseHandle来关闭它,用SetEvent或PulseEvent来设置它使其有信号,用ResetEvent来使其无信号,用WaitForSingleObject或WaitForMultipleObjects来等待其变为有信号。
当一个手动复位的事件对象的状态被置为有信号状态时,该对象状态将一直保持有信号状态,直至明确调用ResetEvent函数将其置为无信号状态。任意数量的等待中线程,以及随后开始等待的线程均会被释放。
当一个自动复位的事件对象的状态被置为有信号状态时,该对象状态将一直保持有信号状态,直至一个等待线程被释放;系统将自动将此状态置为无信号状态。如果没有等待线程正在等待,事件对象的状态将保持有信号状态。
对于自动复位的Event对象,PulseEvent仅释放第一个等待该事件的线程,对象状态随后会被设回Unsingled。
对于手动复位的Event对象,PulseEvent释放所有正在等待该事件的线程,对象状态随后会被设回Unsingled。
BOOL SetEvent();
设置事件的状态为有标记,释放任意等待线程。如果事件是手工的,此事件将保持有标记直到调用ResetEvent。这种情况下将释放多个线程,如果事件是自动的,此事件将保持有标记,直到一个线程被释放,系统将设置事件的状态为无标记。如果没有线程在等待,则此事件将保持有标记,直到一个线程被释放。
HANDLE hThread;
HANDLE hEvent;
DWORD WINAPI ThreadProc1(LPVOID lpParamenter);
int main(int argc, char* argv[])
{
hEvent = CreateEvent(NULL, TRUE, FALSE, "abc");
hThread = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);
getchar();
PulseEvent(hEvent);
Sleep(1000);
getchar();
SetEvent(hEvent);
Sleep(1000);
ResetEvent(hEvent);
getchar();
PulseEvent(hEvent);
Sleep(1000);
TerminateThread(hThread, 0);
printf("Hello World!\n");
return 0;
}
DWORD WINAPI ThreadProc1(LPVOID lParamenter)
{
int iCount = 0;
while(TRUE)
{
WaitForSingleObject(hEvent, INFINITE);
printf("%d\n", iCount++);
}
return 0;
}