l线程中 CreateEvent 和 SetEvent及WaitForSingleObject的两种用法

时间:2022-08-23 20:36:49

http://www.cnblogs.com/MrYuan/p/5238749.html

CreateEvent

函功能描述:创建或打开一个命名的或无名的事件对象.

EVENT有两种状态:发信号,不发信号。 

SetEvent/ResetEvent分别将EVENT置为这两种状态分别是发信号与不发信号。 

WaitForSingleObject()等待,直到参数所指定的OBJECT成为发信号状态时才返回,OBJECT可以是EVENT,也可以是其它内核对象。

在这里举个例子:
先创建一个全局Event对象g_event:
CEvent g_event;
在程序中可以通过调用CEvent::SetEvent设置事件为有信号状态。
1.下面是一个线程函数MyThreadProc()
按 Ctrl+C 复制代码
UINT CFlushDlg::MyThreadProc( LPVOID pParam )
{
    WaitForSingleObject(g_event,INFINITE);
    For(;;)
    {
        ………….
    }
    return 0;
}
在这个线程函数中只有设置g_event为有信号状态时才执行下面的for循环,因为g_event是 全局变量,所以我们可以在别的线程中通过g_event. SetEvent控制这个线程。

2.还有一种用法就是我们可以通过WaitForSingleObject函数来间隔的执行一个线程函数的函数体
l线程中 CreateEvent 和 SetEvent及WaitForSingleObject的两种用法
UINT CFlushDlg::MyThreadProc( LPVOID pParam )
{
while(WaitForSingleObject(g_event,MT_INTERVAL)!=WAIT_OBJECT_0)
{
//……
}
return 0;
}
l线程中 CreateEvent 和 SetEvent及WaitForSingleObject的两种用法
在这个线程函数中可以通过设置MT_INTERVAL来控制这个线程的 函数体多久执行一次,当事件为无信号状态时函数体隔MT_INTERVAL执行一次,当设置事件为有信号状态时,线程就执行完毕了。

区别:
 a. WaitForSingleObject(g_event,INFINITE)在没有 SetEvent(g_event),那么程序到WaitForSingleObject(g_event,INFINITE)会阻塞。

 b. WaitForSingleObject(g_event,MT_INTERVAL)(包括MT_INTERVAL==0的情况),使用 while (WaitForSingleObject(g_event,MT_INTERVAL)!= WAIT_OBJECT_0)不会被阻塞。


验证:
DWORD WINAPI CWaitForObjectDlg::procThread(LPVOID lpVoid)
{
CWaitForObjectDlg *pThis = (CWaitForObjectDlg*)lpVoid;
if (pThis == NULL)
return 0;

::CoInitialize(NULL);

time_t t = time(NULL);
double nSpan = 0;
double nTime = 30;

while (1)
{

if (WaitForSingleObject(pThis->m_hExitEvent, 0) == WAIT_OBJECT_0)
{
int a1= 0;
//break;
}

WaitForSingleObject(pThis->m_hExitEvent,INFINITE);
{
int a2 = 0;
//break;
}

int _c = 0;

}
return 0;
}

void CWaitForObjectDlg::OnBnClickedButtonResetevent()
{
// TODO: 在此添加控件通知处理程序代码
if (m_hExitEvent)
SetEvent(m_hExitEvent);
}