事件(event)分为有名的和无名的,使用有名事件的时候,在不同进程中创建的同名事件,其实就是同一个,这样就可以在不同的进程中使用了。两个进程里面都要创建事件,事件名要一致。
//进程1 HANDLE hPkey_down ;
//创建事件
hPkey_down = CreateEvent(NULL, //是否可被子进程继承,设为NULL为不可继承 FALSE, //是否为手动复原,设为FALSE为自动复原等待线程处理完后自动恢复到无信号状态,若为TRUE则调用ResetEvent(hPkey_down)清除 FALSE, //是否初始化时为有信号状态,设为FALSE为初始无信号状态 TEXT("UserInputEvent")//指定事件对象名称,若设为NULL则创建一个无名事件对象 ); SetEvent(hPkey_down); //触发事件 static DWORD TestThread() { ) { __try { WaitForSingleObject(hPkey_down, INFINITE); //事件触发时执行的操作。。。 } _except(EXCEPTION_EXECUTE_HANDLER) { } } ; }
//进程2 HANDLE hPkey_down ; hPkey_down = CreateEvent(NULL, FALSE, FALSE, TEXT("UserInputEvent")); //创建事件 SetEvent(hPkey_down); //触发事件
附:CE提供了Mutex(互斥Mutual Exclusion)、Event和Semaphore三种内核机制来实现线程之间的同步。
Mutex在资源共享问题上用得比较多
//创建Mutex HANDLE hMutex=CreateMutex( NULL, //CE不支持设置为NULL FALSE, //是否为创建该Mutex的线程所拥有 _T("Mutex名称")); //可选,Mutex的名称 if(!hMutex) { //printf("Failed to CreateMutex().../n"); return FALSE; } if(ERROR_ALREADY_EXISTS == GetLastError()) { //printf("The Mutex is already running.../n"); return FALSE; } //释放Mutex的占用 BOOL ReleaseMutex(hMutex);
Semaphore(信标或者信号灯)可理解为带有计数的Mutex。
//创建一个Semaphore对象 HANDLE hSemaphore= CreateSemaphore(NULL, //CE不支持设置为NULL , //初始化计数 , //最大支持的线程数n _T("Semaphore名称")); // //释放Semaphore对象 BOOL ReleaseSemaphore(hSemaphore,//要释放的Semaphore句柄 , //释放的引用计数个数 ); //返回释放前的Semaphore计数