WaitForSingleObject -- setevent 讲解与编程示例
来源:互联网 发布:重庆网络问政爆料平台 编辑:程序博客网 时间:2024/04/29 16:52
函数一直等待,直到指明的 Handle 处于signed 状态,或者超过规定的时间才返回。
函数原型:
DWORD WINAPI WaitForSingleObject( _In_ HANDLE hHandle, _In_ DWORD dwMilliseconds);
hHandle[in]对象句柄。可以指定一系列的对象,如Event、Job、Memory resource notification、Mutex、Process、Semaphore、Thread、Waitable timer等。
dwMilliseconds[in]超时时间间隔,单位为milliseconds(毫秒)。
WaitForSingleObject函数用来检测 hHandle 事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达 dwMilliseconds 毫秒,但 hHandle 所指向的对象还没有变成有信号状态,函数照样返回。参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE。若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止。
当直接或者间接创建窗口的时候,使用这个函数要小心,因为此时 wait 会导致消息阻塞,进一步导致系统死锁。关于这点可见例子。
SetEvent 函数原型:
BOOL WINAPI SetEvent( _In_ HANDLE hEvent);
hEvent 是一个事件的句柄, 通过 CreateEvent 或者 OpenEvent 返回。函数成功返回非0,失败返回0。
WaitForSingleObject()等待,直到参数所指定的 hHandle 成为发信号状态
时才返回,当 OBJECT 是EVENT 的时候就可以通过 SetEvent 让其返回。
下面是一个小例子:
// wait_for.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <afxmt.h>CEvent g_event;void ThreadFunc1(LPVOID pParam){ ::WaitForSingleObject(NULL/*g_event*/,INFINITE); for( int i = 0; i < 100; i++ ) { printf("ThreadFunc1:%d\n", i); }}void ThreadFunc2(LPVOID pParam){ for( int i = 0; i < 5; i++ ) { printf("ThreadFunc2:%d\n", i); Sleep(1000); } g_event.SetEvent();}int _tmain(int argc, _TCHAR* argv[]){ DWORD m_ThreadID[2]; g_event.ResetEvent(); ::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc1,NULL,0,&m_ThreadID[0]); ::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc2,NULL,0,&m_ThreadID[1]); getchar(); return 0;}
通过例子可以看出 他们之间是如何交互的,需要注意的是上面测试了一下 WaitForSingleObject
参数句柄为NULL的情况:此时不等待直接返回,而不管第二个参数数值。
无效句柄可见示例。
关于 WaitForSingleObject 返回值 参考:
MSDN
关于 SetEvent 可参考:
MSDN
VS2010工程实例
- WaitForSingleObject -- setevent 讲解与编程示例
- SetEvent、PulseEvent与WaitForSingleObject
- WaitForSingleObject SetEvent
- 线程中CreateEvevt、SetEvent与WaitForSingleObject的用法
- CreateEvent、setevent、ResetEvent和WaitForSingleObject
- 一个SetEvent 激活一个WaitForSingleObject
- CreateEvent、SetEvent、ResetEvent和WaitForSingleObject
- CreateEvent/SetEvent/ResetEvent和WaitForSingleObject
- CreateEvent/SetEvent/ResetEvent和WaitForSingleObject
- CreateEvent和SetEvent及WaitForSingleObject的用法
- 线程中SetEvent及WaitForSingleObject用法
- CreateEvent;WaitForSingleObject(g_hEvent,INFINITE);;SetEvent(g_hEvent);
- CreateEvent和SetEvent及WaitForSingleObject的用法
- Windows CreateEvent,SetEvent,WaitForSingleObject的用法
- SetEvent,ResetEvent、ReadDirectoryChangesW、WaitForSingleObject最优博文
- 线程中CreateEvent和SetEvent及WaitForSingleObject
- SetEvent用法示例
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
- H5初体验
- RDD实战
- eclipse使用MyBatisGenerator自动生成相关文件出错:project does not exist
- ubuntu下mysql安装及基本操作
- RHEL7-文件的归档和压缩
- WaitForSingleObject -- setevent 讲解与编程示例
- Hibernate中对象的三种状态及相互转化
- Loadrunner实现文件读写功能
- Delphi的几种类型转换
- WCF大数据量传输配置
- Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
- 2015年第六届蓝桥杯C/C++程序设计本科B组决赛
- Windows中获取线程起始地址
- 应用正则表达式实现input标签自动控制输入数字