MFC事件在多线程中的使用

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;

猜你喜欢

转载自blog.csdn.net/du_shuang/article/details/81070662