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函数来间隔的执行一个线程函数的函数体
在这个线程函数中可以通过设置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)不会被阻塞。
验证:
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); }
相关文章推荐
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法简介
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法(转)
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法(转)
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法-------wince里面的中断IST经常使用。 .
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法-------wince里面的中断IST经常使用。
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法