CreateEvent和SetEvent及WaitForSingleObject的使用方法
CreateEvent:
1、函数功能:
创建一个命名或匿名的事件对象
2、函数原型:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,
// pointer to security attributes
BOOL bManualReset, // flag for manual-reset event
BOOL bInitialState, // flag for initial state
LPCTSTR lpName // pointer to event-object name
);
3、參数解析:
參数1指向一个SECURITY_ATTRIBUTES 结构,假设为空。函数返回的句柄不能被继承。
參数2用于指示创建的事件对象是人工重置还是自己主动重置的。
假设这个參数为TRUE,则为人工重置事件,必须调用ResetEvent置事件为无信号状态;假设这个參数为FALSE,则为自己主动重置事件。当等待的线程被释放后。系统自己主动重置事件为无信号状态。
參数3标识事件的初始状态。假设为TRUE,则事件初始状态为有信号状态,否则,事件初始状态为无信号状态。
參数4标识创建的事件对象名称。当这个參数为NULL时,创建的事件对象为匿名事件。
4、函数返回值:
假设函数返回成功,返回值为事件对象的句柄。
假设函数返回失败,返回值为NULL,能够通过GetLastError()得到错误信息。
5、补充:
假设创建的是一个命名的事件对象,当第2次反复调用的时候,函数返回第1次创建成功的句柄值,这时通过GetLastError()返回的值为ERROR_ALREADY_EXISTS。利用这个特性。能够实现应用程序的单例。
VC声明DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
VB声明Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
參数hHandle是一个事件的句柄。第二个參数dwMilliseconds是时间间隔。假设事件是有信号状态返回WAIT_OBJECT_0。假设时间超过dwMilliseconds值但时间事件还是无信号状态则返回WAIT_TIMEOUT。
hHandle能够是下列对象的句柄:
Change notification
Console input
Event
Job
Memory resource notification
Mutex
Process
Semaphore
Thread
Waitable timer
WaitForSingleObject函数用来检測hHandle事件的信号状态。在某一线程中调用该函数时,线程临时挂起,假设在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数马上返回;假设超时时间已经到达dwMilliseconds毫秒。但hHandle所指向的对象还没有变成有信号状态,函数照样返回。參数dwMilliseconds有两个具有特殊意义的值:0和INFINITE。
若为0,则该函数马上返回;若为INFINITE,则线程一直被挂起。直到hHandle所指向的对象变为有信号状态时为止。
返回值:
WAIT_ABANDONED 0x00000080:当hHandle为mutex时。假设拥有mutex的线程在结束时没有释放核心对象会引发此返回值。
WAIT_OBJECT_0 0x00000000 :核心对象已被激活
WAIT_TIMEOUT 0x00000102:等待超时
WAIT_FAILED 0xFFFFFFFF :出现错误,可通过GetLastError得到错误代码
在这里举个样例:
先创建一个全局Event对象g_event:
CEvent g_event;
在程序中能够通过调用CEvent::SetEvent设置事件为有信号状态。
综合:
首先介绍CreateEvent是创建windows事件的意思,作用主要用在推断线程退出,程锁定方面.
CreateEvent
函功能描写叙述:创建或打开一个命名的或无名的事件对象.
EVENT有两种状态:发信号,不发信号。
SetEvent/ResetEvent分别将EVENT置为这两种状态各自是发信号与不发信号。
WaitForSingleObject()等待,直到參数所指定的OBJECT成为发信号状态时才返回。OBJECT能够是EVENT,
也能够是其他内核对象。
当你创建一个线程时,事实上那个线程是一个循环。不像上面那样仅仅执行一次的。这样就带来了一个问题,
在那个死循环里要找到合适的条件退出那个死循环,那么是怎么样实现它的呢?在Windows里往往是採用
事件的方式。当然还能够採用其他的方式。在这里先介绍採用事件的方式来通知从线程执行函数退出来,
它的实现原理是这样。在那个死循环里不断地使用WaitForSingleObject函数来检查事件是否满足。假设
满足就退出线程。不满足就继续执行。
当在线程里执行堵塞的函数时,就须要在退出线程时,先要把堵塞
状态变成非堵塞状态,比方使用一个线程去接收网络数据,同一时候使用堵塞的SOCKET时。那么要先关闭
SOCKET。再发送事件信号。才干够退出线程的。
当然我感觉重要应用方面还是用来锁定,实现所谓的pv功能。
以下介绍函数功能,參数等
1.CreateEvent
函数功能描写叙述:创建或打开一个命名的或无名的事件对象
函数原型:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性
BOOL bManualReset, // 复位方式
BOOL bInitialState, // 初始状态
LPCTSTR lpName // 对象名称
);
參数:
lpEventAttributes:
[输入]一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否可被子进程继承。假设lpEventAttributes是NULL。此句柄不能被继承。
Windows NT/2000:lpEventAttributes的结构中的成员为新的事件指定了一个安全符。假设pEventAttributes是NULL。事件将获得一个默认的安全符。
bManualReset:
[输入]指定将事件对象创建成手动复原还是自己主动复原。
假设是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。
假设设置为FALSE。当事件被一个等待线程释放以后。系统将会自动将事件状态复原为无信号状态。
bInitialState:
[输入]指定事件对象的初始状态。假设为TRUE,初始状态为有信号状态。否则为无信号状态。
lpName:
[输入]指定事件的对象的名称,是一个以0结束的字符串指针。名称的字符格式限定在MAX_PATH之内。名字是对大写和小写敏感的。
假设lpName指定的名字。与一个存在的命名的事件对象的名称同样,函数将请求EVENT_ALL_ACCESS来訪问存在的对象。这时候,因为bManualReset和bInitialState參数已经在创建事件的进程中设置。这两个參数将被忽略。
假设lpEventAttributes是參数不是NULL。它将确定此句柄能否够被继承。可是其安全描写叙述符成员将被忽略。
假设lpName为NULL。将创建一个无名的事件对象。
假设lpName的和一个存在的信号、相互排斥、等待计时器、作业或者是文件映射对象名称同样,函数将会失败。在GetLastError函数中将返回ERROR_INVALID_HANDLE。造成这样的现象的原因是这些对象共享同一个命名空间。
一个Event被创建以后,能够用OpenEvent()API来获得它的Handle,用CloseHandle() 来关闭它,用SetEvent()或PulseEvent()来设置它使其有信号,用ResetEvent()
来使其无信号,用WaitForSingleObject()或WaitForMultipleObjects()来等待 其变为有信号.
PulseEvent()是一个比較有意思的用法,正如这个API的名字,它使一个Event 对象的状态发生一次脉冲变化,从无信号变成有信号再变成无信号,而整个操作是原子的.
对自己主动复位的Event对象,它仅释放第一个等到该事件的thread(假设有),而对于 人工复位的Event对象,它释放全部等待的thread.
2. WaitForSingleObject的使用方法
WaitForSingleObject的使用方法
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
參数hHandle是一个事件的句柄,第二个參数dwMilliseconds是时间间隔。假设时间是有信号状态返回
WAIT_OBJECT_0,假设时间超过dwMilliseconds值但时间事件还是无信号状态则返回WAIT_TIMEOUT。
hHandle能够是下列对象的句柄:
Change notification
Console input
Event
Job
Memory resource notification
Mutex
Process
Semaphore
Thread
Waitable timer
WaitForSingleObject函数用来检測hHandle事件的信号状态。当函数的运行时间超过dwMilliseconds就返回,但假设參数dwMilliseconds为INFINITE时函数将直到对应时间事件变成有信号状态才返回。否则就一直等待下去,直到WaitForSingleObject有返回直才运行后面的代码。
CreateEvent和SetEvent及WaitForSingleObject的使用方法的更多相关文章
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,线程锁定方面. CreateEvent 函功能描述:创建或打开一个命名的或无名的事件对象. EVENT有两种状态 ...
- Windows CreateEvent,SetEvent,WaitForSingleObject的用法
http://blog.pfan.cn/embed/19089.html WaitForSingleObject的用法 DWORD WaitForSingleObject( HANDLE hHan ...
- CreateEvent、SetEvent、ResetEvent和WaitForSingleObject
事件对象就像一个开关:它仅仅有两种状态---开和关.当一个事件处于"开"状态.我们称其为"有信号".否则称为"无信号". 能够在一个线程的运 ...
- 事件EVENT与waitforsingleobject的使用以及Mutex与Event的区别
Mutex与Event控制互斥事件的使用详解 最近写一程序,误用了Mutex的功能,错把Mutex当Event用了. [Mutex] 使用Mutex的主要函数:CreateMutex.ReleaseM ...
- CreatarGlobe实现多机立体显示方案(初稿)
CreatarGlobe实现多机立体显示方案(初稿) 关键字 : 集群渲染 立体显示 大屏幕 边缘融合 多机同步 多机同步显示 关键字: 大屏幕投影融合系统解决方案 集群渲染 多机3D同步显示又称“集 ...
- VRSProcess(一)
1.freopen( "CONOUT$","w",stdout);在操作系统中,命令行控制台(即键盘或者显示器)被视为一个文件,既然是文件,那么就有“文件名”. ...
- CreateEvent的使用方法
CreateEvent的使用方法收藏 新一篇: PreCreateWindow的作用和用法 | 旧一篇: VC中_T()的作用 function StorePage(){d=document;t=d ...
- SETEVENT的使用
来源:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686915(v=vs.85).aspx 昨天看到这个SetEvent的方法 ...
- C++ 系列:多线程编程基础知识
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...
随机推荐
- 新浪微博5s钟后跳转页面
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 解决Django中在.js文件中用ajax请求后端,找不到CSRF问题
function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie != ...
- c语言实现类似重载的功能
今天man了一下open,发现open函数的原型居然看着是重载,C语言不是不支持重载么,经过一番搜寻之后,总结如下: 可变长参数函数 C语言是不支持函数重载机制的,但是支持变长参数函数,当然C++也是 ...
- dp之二维背包poj2576
题意:有一群sb要拔河,把这群sb分为两拨,两拨sb数只差不能大于1,输出这两拨人的体重,小的在前面...... 思路:把总人数除2,总重量除2,之后你会发现就是个简单的二维背包,有两个限制..... ...
- javascript publish/subscribe or observer pattern
定义 定义一对多的对象封装,目标对象状态发生变化,它所有的接受者都会收到通知并做相应的更新. 使用频率:5/5 最高 概要 观察者模式,也就是发布者/订阅者模式,当发布者发布一个通知的时候,订阅者就 ...
- ASPxGridView常用总结
目录:一.客户端常用1.常用API2.聚焦行变更事件3.客户端选择多行4.客户端选择行5. 获取选择的行数目6.单击行时,选中行7.通过checkbox 选择行8.选择所有行9.启动编辑框,Conta ...
- Java中HashMap实现原理
类声明: 概述: 线程不安全: <Key, Value>两者都可以为null: 不保证映射的顺序,特别是它不保证该顺序恒久不变: HashMap使用Iterator: HashMap中ha ...
- 【Unity笔记】获得鼠标点击屏幕的位置,并转成世界坐标
Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
- 【Unity/Kinect】显示Kinect摄像头内容,屏幕显示环境背景及人体投影
最近学习用Unity做些体感小游戏,使用Kinect的Unity插件,结合一些官方Demo学习(网上资源用Unity做的较少,蛋疼).插件及其Demo就在Unity商店里搜Kinect即可找到,其中下 ...
- NTP原理
ntp原理与设置 原创 2016年09月17日 15:28:16 标签: ntp / 原理 / 设置 / linux / 时钟同 ...