本文共 1455 字,大约阅读时间需要 4 分钟。
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;}
转载地址:http://sssli.baihongyu.com/