HANDLE mThreadEventDead;
mThreadEventDead=CreateEvent(NULL,TRUE,FALSE,NULL)
上面创建了一个事件,CreateEvent的具体使用如下。
HANDLE WINAPI CreateEvent(
_In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes,
_In_ BOOL bManualReset,
_In_ BOOL bInitialState,
_In_opt_ LPCTSTR lpName
);
第一个参数:安全属性,一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否可被子进程继承。如果lpEventAttributes是NULL,此句柄不能被继承。
第二个参数:复位方式,指定将事件对象创建成手动复原还是自动复原。如果是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。如果设置为FALSE,当一个等待线程被释放以后,系统将会自动将事件状态复原为无信号状态。
第三个参数:初始状态.
第四个参数:对象名称,如果lpName为NULL,将创建一个无名的事件对象.
上面的代码将事件的初始状态设置为false。
当我们运行完一个线程时在线程的最后面加上一句setEvent(mThreadEvent),代码如下:
void m_Thread(void *param)
{
SetEvent(mThreadEventDead);
_endthread();
}
当线程函数执行完时,将事件激活,然后通过这个判断线程是否结束。
SetEvent(mThreadEventDead)将事件从初始状态false(未激发)激活为true(激发)状态
ResetEvent(mThreadEventDead)重新将事件设置为未激发状态。
WaitForSingleObject(mThreadEventDead, INFINITE);
waitForSingleObject的具体定义如下:
DWORD WaitForSingleObject( HANDLE hHandle, DWORDdwMilliseconds);
当hHandle处于signed状态则该函数正常返回,如果hHandle未被激活状态,则该函数陷入沉睡即堵塞程序继续向下执行,通常用于等待线程停止才能云运行的程序上面。
使用完了记得关闭事件:
CloseHandle(mThreadEventDead);
mThreadEventDead = NULL;