您的位置:首页 > 移动开发 > Objective-C

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

2016-10-13 17:33 726 查看
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: