事件对象Event的使用
来源:互联网 发布:fastdfs nginx windows 编辑:程序博客网 时间:2024/05/16 09:23
最近使用到Event,做一下总结。
1、对象的创建:
创建了一个匿名的初始状态为“无信号”状态的Event。
HANDLE _hEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
2、信号状态切换:
::SetEvent(_hEvent); // 设置为有信号状态.::ResetEvent(_hEvent); // 设置为无信号状态.
DWORD dwRet = 0;int time_ms = 100;dwRet = ::WaitForSingleObject(_hEvent, INFINITE);dwRet = ::WaitForSingleObject(_hEvent, 0);dwRet = ::WaitForSingleObject(_hEvent, time_ms);
可以使用::WaitForSingleObject来查询信号状态。当第二个参数为INFINITE时,将一直等待,直到Event变为有状态。当第二个参数为0时,只是即时查询Event的状态并立即返回。当第二个参数为其他时间时,除非超时或者Event变为有状态才返回。
当dwRet为WAIT_OBJECT_0时,表示信号变为有状态。若dwRet为WAIT_TIMEOUT,表示超时。
4、使用示例
我们用一个使用示例来看看Event的用法。比如我们有三块缓存或者文件,需要在整个程序运行过程中每隔1000ms保存一次。如下:
class CMyRawFile{public:void Save();// ...};class CConfigFileMgr{public:CConfigFileMgr() : m_hEvent(NULL), m_hThread(NULL){unsigned int id = 0;m_hEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);m_hThread = (HANDLE)_beginthreadex(NULL, 0, _Thread_Proc, (void*)this, 0, &id);if (m_hThread){::WaitForSingleObject(m_hThread, 10);}}~CConfigFileMgr(){if (m_hThread){if (m_hEvent){::SetEvent(m_hEvent);}::WaitForSingleObject(m_hThread, INFINITE);::CloseHandle(m_hThread);m_hThread = NULL;}if (m_hEvent){::CloseHandle(m_hEvent);m_hEvent = NULL;}}static unsinged __stdcall _Thread_Proc(void* pParam){CConfigFileMgr* pThis = (CConfigFileMgr*)pParam;if (!pThis){return 0;}while (true){DWORD dwRet = ::WaitForSingleObject(m_hEvent, 1000);if (dwRet == WAIT_OBJECT_0){break;}else if (dwRet == WAIT_TIMEOUT){pThis->m_sysConfig.Save();pThis->m_usrConfig.Save();pThis->m_cache.Save();}}pThis->m_sysConfig.Save();pThis->m_usrConfig.Save();pThis->m_cache.Save();_endthreadex(0);return 0;}private:HANDLEm_hEvent;HANDLEm_hThread;CMyRawFilem_sysConfig;CMyRawFilem_usrConfig;CMyRawFilem_cache;};
因为我们在初始创建Event时将信号状态设为FALSE,此后一直没有变化,所以在_Thread_Proc线程函数中WaitForSingleObject一直在等待1000ms后返回WAIT_TIMEOUT,使得文件的保存操作得以调用。
当程序退出时,CConfigFileMgr对象需要析构,则调用SetEvent将信号设置为有状态,然后紧接着让m_hThread对应的线程进入等待,这时_Thread_Proc又检测到m_hEvent有信号,返回WAIT_OBJECT_0。使得死循环跳出,然后用_endthreadex结束线程。
最终关闭释放所有HANDLE,整个程序结束。可以看出,_Thread_Proc函数实际上起到了一个定时器的效果。
- 事件对象Event的使用
- Event对象的事件句柄
- DOM的事件对象event
- Event事件的使用练习
- Event事件对象之Event
- JavaScript的事件机制event对象
- javascript事件;event对象的属性
- JQuery的event事件对象详解
- javascript事件;event对象的属性
- 浅谈JavaScript的事件对象event
- js中事件对象event的兼容性问题
- 鼠标事件中event对象的坐标
- 同步对象Event的使用
- Event事件对象
- event-事件对象
- Event 事件对象
- 事件event对象
- 事件对象event
- Mpalyer-1.0rc4在tq2440上的移植
- poi生成execl综合
- 本机中有哪些端口号被哪些程序占用工具
- windows 下查看tomcat的启动日志
- 0, \0, NULL的区别
- 事件对象Event的使用
- Spring Cron表达式的详细用法
- 火狐将进军iOS 全新设计能否提升体验?
- 分组报表横向扩展求和
- 程序员到底怎么了
- jquery livequery插件使用
- LR的响应时间与使用IE所感受时间不一致的讨论
- int 和 String 互相转换的多种方法
- asp.net 2.0 Chart画图