1.CreateEvent 是创建windows事件的意思,作用主要用在判断线程退出,程锁定方面.

函功能描述:创建或打开一个命名的或无名的事件对象。

HANDLE m_hExit;

m_hExit= CreateEvent( NULL, TRUE, FALSE, NULL );

EVENT有两种状态:发信号,不发信号。

2.SetEvent/ResetEvent 分别将EVENT置为这两种状态分别是发信号与不发信号

3.WaitForSingleObject()等待。直到参数所指定的OBJECT成为发信号状态时才返回,OBJECT可以是EVENT,也可以是其它内核对象。

——————————————————————————————————————————————————————————————————————————————

当你创建一个线程时,其实那个线程是一个循环,不像上面 那样只运行一次的。这样就带来了一个问题,在那个死循环里要找到合适的条件退出那个死循环,那么是怎么样实现它的呢?在Windows里往往是采用事件的 方式,当然还可以采用其它的方式。在这里先介绍采用事件的方式来通知从线程运行函数退出来,它的实现原理是这样,在那个死循环里不断地使用 WaitForSingleObject函数来检查事件是否满足,如果满足就退出线程,不满足就继续运行。当在线程里运行阻塞的函数时,就需要在退出线程 时,先要把阻塞状态变成非阻塞状态,比如使用一个线程去接收网络数据,同时使用阻塞的SOCKET时,那么要先关闭SOCKET,再发送事件信号,才可以 退出线程的。

下面介绍函数功能,参数等

1.CreateEvent

函数功能描述:创建或打开一个命名的或无名的事件对象

函数原型:

HANDLE CreateEvent(

LPSECURITY_ATTRIBUTES lpEventAttributes,   // 安全属性

BOOL bManualReset,   // 复位方式

BOOL bInitialState,   // 初始状态

LPCTSTR lpName   // 对象名称

);

参数:

lpEventAttributes:

[输入]一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否可被子进程继承。如果lpEventAttributes是NULL,此句柄不能被继承。

Windows NT/2000:lpEventAttributes的结构中的成员为新的事件指定了一个安全符。如果lpEventAttributes是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。造成这种现象的原因是这些对象共享同一个命名空间。

终端服务(Terminal Services):名称中可以加入"Global\"或是"Local\"的前缀,这样可以明确的将对象创建在全局的或事务的命名空间。名称的其它部分 除了反斜杠(\),可以使用任意字符。详细内容可参考Kernel Object Name Spaces。

Windows 2000:在Windows 2000系统中,没有终端服务运行,"Global\"和"Local\"前缀将被忽略。名称的其它部分除了反斜杠(\),可以使用任意字符。

Windows NT 4.0以及早期版本, Windows 95/98:名称中除了反斜杠(\),可以使用任意字符。

返回值:

如果函数调用成功,函数返回事件对象的句柄。如果对于命名的对象,在函数调用前已经被创建,函数将返回存在的事件对象的句柄,而且在GetLastError函数中返回ERROR_ALREADY_EXISTS。

如果函数失败,函数返回值为NULL,如果需要获得详细的错误信息,需要调用GetLastError。

备注:

调用CreateEvent函数返回的句柄,该句柄具有EVENT_ALL_ACCESS权限去访问新的事件对象,同时它可以在任何有此事件对象句柄的函数中使用。

在调用的过程中,所有线程都可以在一个等待函数中指定事件对象句柄。当指定的对象的状态被置为有信号状态时,单对象等待函数将返回。

对于多对象等待函数,可以指定为任意或所有指定的对象被置为有信号状态。当等待函数返回时,等待线程将被释放去继续运行。

初始状态在bInitialState参数中进行设置。使用SetEvent函数将事件对象的状态置为有信号状态。使用ResetEvent函数将事件对象的状态置为无信号状态。

当一个手动复原的事件对象的状态被置为有信号状态时,该对象状态将一直保持有信号状态,直至明确调用ResetEvent函数将其置为无符号状态。

当事件的对象被置为有信号状态时,任意数量的等待中线程,以及随后开始等待的线程均会被释放。

当一个自动复原的事件对象的状态被置为有信号状态时,该对象状态将一直保持有信号状态,直至一个等待线程被释放;系统将自动将此函数置为无符号状态。如果没有等待线程正在等待,事件对象的状态将保持有信号状态。

多个进程可持有同一个事件对象的多个句柄,可以通过使用此对象来实现进程间的同步。下面的对象共享机制是可行的:

·在CreateEvent函数中,lpEventAttributes参数指定句柄可被继承时,通过CreateProcess函数创建的子进程继承的事件对象句柄。

·一个进程可以在DuplicateHandle函数中指定事件对象句柄,从而获得一个复制的句柄,此句柄可以被其它进程使用。

·一个进程可以在OpenEvent或CreateEvent函数中指定一个名字,从而获得一个有名的事件对象句柄。

使用CloseHandle函数关闭句柄。当进程停止时,系统将自动关闭句柄。当最后一个句柄被关闭后,事件对象将被销毁。

使用环境:

Windows NT/2000:需要3.1或更高版本

Windows 95/98:需要Windows 95或更高版本

头文件:定义在Winbase.h;需要包含 Windows.h。

导入库:user32.lib

Unicode:在Windows NT/2000中,以 Unicode 和 ANSI 执行

一个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有返回直才执行后面的代码。在这里举个例 子:

先创建一个全局Event对象g_event:

CEvent g_event;

在程序中可以通过调用CEvent::SetEvent设置事件为有信号状态。

下面是一个线程函数MyThreadPro()

UINT CFlushDlg::MyThreadProc( LPVOID pParam )

{

WaitForSingleObject(g_event,INFINITE);

For(;;)

{

………….

}

return 0;

}

在这个线程函数中只有设置g_event为有信号状态时才执行下面的for循环 ,因为g_event是全局变量,所以我们可以在别的线程中通过g_event. SetEvent控制这个线程。

还有一种用法就是我们可以通过WaitForSingleObject函数来间隔的执行一个线程函数的函数体

UINT CFlushDlg::MyThreadProc( LPVOID pParam )

{

while(WaitForSingleObject(g_event,MT_INTERVAL)!=WAIT_OBJECT_0)

{

………………

}

return 0;

}

在这个线程函数中可以可以通过设置MT_INTERVAL来控制这个线程的函数体多久执行一次,当事件为无信号状态时函数体隔MT_INTERVAL执行一次,当设置事件为有信号状态时,线程就执行完毕了(return 0)。

CreateEvent/SetEvent/ResetEvent和WaitForSingleObject相关推荐

  1. CreateEvent() SetEvent() ResetEvent() 进程互斥

    首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,线程锁定方面. CreateEvent 函功能描述:创建或打开一个命名的或无名的事件对象. EVENT有两种状态 ...

  2. c++ 线程中CreateEvent SetEvent/ResetEvent WaitForSingleObject的使用

    HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes,   // 安全属性 BOOL bManualReset,   // 复位方式, ...

  3. CreateEvent SetEvent ResetEvent

    CreatEvent():创建一个事件对象  SetEvent():把指定事件对象的状态设置为发信号状态 ResetEvent():把指定事件对象的状态设置为不发信号状态 函数CreateEvent创 ...

  4. 线程中CreateEvent和SetEvent和ReSetEvent及WaitForSingleObject的用法

    概述 首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,程锁定方面. CreateEvent:创建或打开一个命名的或无名的事件对象. EVENT有两种状态:发信号 ...

  5. C++事件SetEvent,ResetEvent的使用

    一.概念 创建事件: HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // SECURITY_ATTRIBUTES结构指针,可 ...

  6. CreateEvent、SetEvent、ResetEvent和WaitForSingleObject

    事件对象就像一个开关:它只有两种状态---开和关.当一个事件处于"开"状态,我们称其为"有信号",否则称为"无信号".可以在一个线程的执行函 ...

  7. 【CreateEvent与SetEvent/ResetEvent】

    CreateEvent:创建Window事件,创建或打开一个命名的或无名的事件对象. 创建的事件有两种状态:发送信号和不发送信号: SetEvent:将事件设置为发送信号 ResetEvent:将事件 ...

  8. C++事件的建立和使用SetEvent,ResetEvent

    一.事件是很常用的多线程同步互斥机制 函数原型如下所示,一共四个参数: HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // ...

  9. SetEvent/ResetEvent

    该博客旨在分享IT技术心得和实际工作中遇到问题的解决方法,以下是新浪博客地址http://blog.sina.com.cn/qianyumolu,则为分享经济.行业趋势.心灵文章等,有兴趣的朋友可以踩 ...

最新文章

  1. Pandas判断dataframe是否为空
  2. 【IMOOC学习笔记】多种多样的App主界面Tab实现方法(二)
  3. 数据中心(机房)监控方案
  4. 网络游戏server编程,第一章笔记
  5. Combox使用的一些技巧
  6. hadoop主节点切换_hadoop2.0 HA的主备自动切换
  7. 信息学奥赛一本通(1402:Vigenère密码)
  8. 网络安全——浅谈——AAA认证技术——登录授权、配置命令
  9. Scrum立会报告+燃尽图(Final阶段第四次)
  10. 30个值得推荐的数据可视化工具(2022年最新)
  11. 网络安全和CTF相关内容
  12. mysql注入转义绕过_SQL注入防御绕过——二次注入
  13. 第4章 Function语义学
  14. 计算机第三套演示文稿yswg.pptx,打开考生文件夹下的演示文稿yswg.pptx,根据考生文件夹下的文件“PPT-素材.docx”,按照下列要求完善 - 赏学吧...
  15. 005_软件安装之_常用办公软件
  16. ​燕东微科创板上市:市值276亿 亦庄国投与京东方是股东
  17. ssh-keygen -t rsa -C xxxx@xxxx.com解释
  18. fc天使之翼2020修改版下载_(安卓游戏)闲置超市大亨无限金钱版、模拟经营——安卓游戏下载资讯攻略信息...
  19. c# 调用zebra打印指令 打印到USB端口
  20. 转一次排障经历以供学习

热门文章

  1. 解决“warning C280 ‘xxx‘ unreferenced local variable”告警方法
  2. 机器人导论(第四版)学习笔记——第一章
  3. 加盐hash保存密码的正确方式
  4. 使用phpnuke建站心得
  5. 相关性检验之Pearson系数及python实现
  6. whistle抓包工具应用
  7. usb驱动程序初步编写
  8. 笔记本电池使用误区及正确保养
  9. 学计算机的有多少人,究竟有多少人在学习计算机科学技术
  10. 喜讯频传 英特尔为电竞产业持续赋能