源出处:http://blog.csdn.net/richerg85/article/details/7538493

此文主要说明的是,c++中创建的一个事件内核对象可以在不同的程序(进程)间共用,也就是说多个程序可以处理同一个事件对象。可以使用此事件对象实现进程间的同步。

关于CreateEvent说明,可参见c++中CreateEvent函数解析(2)

当不同的进程间需要同步一些数据,例如只有进程1中的数据准备好时,进程2中的一个计算函数才能启用,这样可以保持数据同步,所以可以使用设置事件的信号的有无实现进程间的激活。

在《c++中CreateEvent函数解析(2)》中,强调一下下面的细节:

msdn上关于CreateEvent函数中参数bManualReset参数取值:手动重置和自动重置。关于其不同:

When the state of a manual-reset event object is signaled, it remains signaled until it is explicitly reset to nonsignaled by theResetEvent function. Any number of waiting threads, or threads that subsequently begin wait operations for the specified event object, can be released while the object's state is signaled.

When the state of an auto-reset event object is signaled, it remains signaled until a single waiting thread is released; the system then automatically resets the state to nonsignaled. If no threads are waiting, the event object's state remains signaled.

翻译如下:

当一个手动复原的事件对象的状态被置为有信号状态时,该对象将一直保持有信号状态,直至明确调用ResetEvent函数将其置为无符号状态。当事件对象被设置为有信号状态时,任何数量的等待线程或者随后等待的线程都会被释放。
    当一个自动复原事件对象的状态被设置为有信号状态时,该对象一直保持有信号状态,直至一个单等待线程被释放;系统然后会自动重置对象到无信号状态。

事件1进程(Event1.exe)

  1. #include <iostream>
  2. #include <windows.h>
  3. #include <string>
  4. using namespace std;
  5. #define EventName "eventName"
  6. int main(int argc, char* argv[])
  7. {
  8. HANDLE handle = CreateEvent(NULL,FALSE, FALSE,EventName);
  9. if (handle != NULL)
  10. {
  11. int count = 0;
  12. while (count < 10)
  13. {
  14. WaitForSingleObject(handle,INFINITE);
  15. cout<<"EVENT1有信号了:"<<++count<<endl;
  16. Sleep(2000);
  17. ResetEvent(handle);
  18. }
  19. }
  20. return 0;
  21. }

从程序中此进程中创建了一个名为eventName的事件,从参数中设置可以看出,此事件是手动重置并且初始化的时候为无信号的。

然后是一个while循环,通过WaitForSingleObjet函数等待此事件为有信号,这样才能打印出下面的信息。启动此进程的时候,进程会一直等待。

事件2进程(Event2.exe)

  1. #include <iostream>
  2. #include <windows.h>
  3. #include <string>
  4. using namespace std;
  5. #define EventName "eventName"
  6. int main(int argc, char* argv[])
  7. {
  8. HANDLE handle = OpenEvent(EVENT_ALL_ACCESS,NULL,EventName);
  9. if (handle != NULL)
  10. {
  11. int count = 0;
  12. while (count < 10)
  13. {
  14. SetEvent(handle);
  15. cout<<"EVENT2有信号了:"<<++count<<endl;
  16. Sleep(2000);
  17. }
  18. }
  19. return 0;
  20. }

从程序中可以看出,此进程没有创建新的进程,而是打开一个进程名为eventName的事件,如果没有此名字的事件,则程序会直接退出。

如果此时,我们已经运行Event1.exe,那么此进程会找到这个事件,执行下面的SetEvent函数,这样事件变为有信号状态。

此时,Event1.exe的WaitForSingleObject函数检测到事件为有信号状态,打印信息,同时Event2.exe无条件的打印。

运行结果如下:

c++事件内核对象(event)进程间激活(转)的更多相关文章

  1. 异步设备IO OVERLAPPED结构(设备内核对象 事件内核对象 可提醒IO)

    同步IO是指:线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请求后并不会挂起而是继续执行.IO完毕后会得到设备驱动程序的通知. 一.异步准备与OVERLAPPED结构 ...

  2. IBinder对象在进程间传递的形式(一)

    命题 当service经常被远程调用时,我们经常常使用到aidl来定一个接口供service和client来使用,这个事实上就是使用Binder机制的IPC通信.当client bind servic ...

  3. 第9章 用内核对象进行线程同步(1)_事件对象(Event)

    9.1 等待函数 (1)WaitForSingleObject(hObject,dwMilliseonds); ①dwMilliseconds为INFINITE时表示无限等待 ②dwMilliseco ...

  4. (转)内核线程对象--Event事件对象

    在所有的内核对象中,事件内核对象是个最基本的对象.事件能够通知一个操作已经完成. 客户机和一个服务器,它们之间需要互相进行通信例子(vs2008 ) 事件内核对象的组成 一个使用计数(与所有内核对象一 ...

  5. Windows进程的内核对象句柄表

    当一个进程被初始化时,系统要为它分配一个句柄表.该句柄表只用于内核对象 ,不用于用户对象或GDI对象. 创建内核对象 当进程初次被初始化时,它的句柄表是空的.然后,当进程中的线程调用创建内核对象的函数 ...

  6. 【Windows 操作系统】Windows 进程的内核对象句柄表

    总结: 1.句柄就是进程句柄表中的索引.2.句柄是对进程范围内一个内核对象地址的引用,一个进程的句柄传给另一个进程是无效的.一个内核对象可用有多个句柄.Windows之所以要设立句柄,根本上源于内存管 ...

  7. windows核心编程---第八章 使用内核对象进行线程同步

    使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...

  8. windows核心编程---第三章 内核对象及句柄本质

      本章讨论的是相对抽象的概念,不涉及任何具体的内核对象的细节而是讨论所有内核对象的共有特性. 首先让我们来了解一下什么是内核对象.内核对象通过API来创建,每个内核对象是一个数据结构,它对应一块内存 ...

  9. Windows API学习---线程与内核对象的同步

    前言 若干种内核对象,包括进程,线程和作业.可以将所有这些内核对象用于同步目的.对于线程同步来说,这些内核对象中的每种对象都可以说是处于已通知或未通知的状态之中.这种状态的切换是由Microsoft为 ...

随机推荐

  1. ntfs安全权限和共享权限的区别

    win xp 最大分区32G,最大文件大小4G. 共享权限是为网络用户设置的,NTFS权限是对文件夹设置的. 用户对文件夹有什么权限就是看NTFS权限的设置. 如果一个文件夹设置成共享,其具体的权限还 ...

  2. 查看cics 运行状态

     查看cics 运行状态cicscp -v status all 

  3. JS日期(Date)处理函数总结

    获取日期 1.Date() ——返回当日的日期和时间. 2.getDate() ——从 Date 对象返回一个月中的某一天 (1 ~ 31). 3.getDay() ——从 Date 对象返回一周中的 ...

  4. c# 数据库操作学习

    一. 如何处理数据库连接 1. 数据库连接可以分为“物理连接”和“逻辑连接”(默认使用连接池的情况下Pooling=true): 物理连接:创建数据库连接时,默认会有一定数量的物理连接(默认Min P ...

  5. phpQuery采集微信公众号文章乱码

    终于找到解决方案了,这是一个值得庆祝的事情.... 原来是因为微信在源码中加入了防采集代码<!--headTrap<body></body><head>< ...

  6. 一款jQuery满屏自适应焦点图切换特效

    一款jQuery满屏自适应焦点图切换特效 ,自适应当前浏览器的宽度,可以作为网站整个大背景的却换效果,很不错的一款不jquery特效. 兼容性没的说直接秒杀了IE6.适用浏览器:IE6.IE7.IE8 ...

  7. 【PHP】文件上传限制

    上传文件,只判断后缀,貌似还不是很严谨; /** * 判断文件是否合法 * @param $files * @param $arrCode * @return number|boolean */ fu ...

  8. Python之mongodb操作

    1.安装驱动pymongo 输入命令:pip install pymongo 2.直接使用驱动 #encoding=utf-8 from pymongo import MongoClient clie ...

  9. 09-排序2 Insert or Merge

    要点就是把排序每一步,判断一下是否和第二组数据相同,若相同则输出排序方法和下一次序列. According to Wikipedia: Insertion sort iterates, consumi ...

  10. STM32F4_引领入门

    Ⅰ.概述 该文写给那些想学ST芯片开发(或初级学习)的朋友,文章着重细节,或许有点简单. 笔者想告诉那些刚开始学习ST的朋友,不管你使用哪一个系列(F0.F1.F2),哪一种型号芯片,其实学习的方法和 ...