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函数来间隔的执行一个线程函数的函数体
UINT CFlushDlg::MyThreadProc( LPVOID pParam )
{
while(WaitForSingleObject(g_event,MT_INTERVAL)!=WAIT_OBJECT_0)
{
//……
}
return 0;
}
在这个线程函数中可以通过设置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);
}