c++事件内核对象(event)进程间激活(转)
源出处: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)
- #include <iostream>
- #include <windows.h>
- #include <string>
- using namespace std;
- #define EventName "eventName"
- int main(int argc, char* argv[])
- {
- HANDLE handle = CreateEvent(NULL,FALSE, FALSE,EventName);
- if (handle != NULL)
- {
- int count = 0;
- while (count < 10)
- {
- WaitForSingleObject(handle,INFINITE);
- cout<<"EVENT1有信号了:"<<++count<<endl;
- Sleep(2000);
- ResetEvent(handle);
- }
- }
- return 0;
- }
从程序中此进程中创建了一个名为eventName的事件,从参数中设置可以看出,此事件是手动重置并且初始化的时候为无信号的。
然后是一个while循环,通过WaitForSingleObjet函数等待此事件为有信号,这样才能打印出下面的信息。启动此进程的时候,进程会一直等待。
事件2进程(Event2.exe)
- #include <iostream>
- #include <windows.h>
- #include <string>
- using namespace std;
- #define EventName "eventName"
- int main(int argc, char* argv[])
- {
- HANDLE handle = OpenEvent(EVENT_ALL_ACCESS,NULL,EventName);
- if (handle != NULL)
- {
- int count = 0;
- while (count < 10)
- {
- SetEvent(handle);
- cout<<"EVENT2有信号了:"<<++count<<endl;
- Sleep(2000);
- }
- }
- return 0;
- }
从程序中可以看出,此进程没有创建新的进程,而是打开一个进程名为eventName的事件,如果没有此名字的事件,则程序会直接退出。
如果此时,我们已经运行Event1.exe,那么此进程会找到这个事件,执行下面的SetEvent函数,这样事件变为有信号状态。
此时,Event1.exe的WaitForSingleObject函数检测到事件为有信号状态,打印信息,同时Event2.exe无条件的打印。
运行结果如下:

c++事件内核对象(event)进程间激活(转)的更多相关文章
- 异步设备IO OVERLAPPED结构(设备内核对象 事件内核对象 可提醒IO)
同步IO是指:线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请求后并不会挂起而是继续执行.IO完毕后会得到设备驱动程序的通知. 一.异步准备与OVERLAPPED结构 ...
- IBinder对象在进程间传递的形式(一)
命题 当service经常被远程调用时,我们经常常使用到aidl来定一个接口供service和client来使用,这个事实上就是使用Binder机制的IPC通信.当client bind servic ...
- 第9章 用内核对象进行线程同步(1)_事件对象(Event)
9.1 等待函数 (1)WaitForSingleObject(hObject,dwMilliseonds); ①dwMilliseconds为INFINITE时表示无限等待 ②dwMilliseco ...
- (转)内核线程对象--Event事件对象
在所有的内核对象中,事件内核对象是个最基本的对象.事件能够通知一个操作已经完成. 客户机和一个服务器,它们之间需要互相进行通信例子(vs2008 ) 事件内核对象的组成 一个使用计数(与所有内核对象一 ...
- Windows进程的内核对象句柄表
当一个进程被初始化时,系统要为它分配一个句柄表.该句柄表只用于内核对象 ,不用于用户对象或GDI对象. 创建内核对象 当进程初次被初始化时,它的句柄表是空的.然后,当进程中的线程调用创建内核对象的函数 ...
- 【Windows 操作系统】Windows 进程的内核对象句柄表
总结: 1.句柄就是进程句柄表中的索引.2.句柄是对进程范围内一个内核对象地址的引用,一个进程的句柄传给另一个进程是无效的.一个内核对象可用有多个句柄.Windows之所以要设立句柄,根本上源于内存管 ...
- windows核心编程---第八章 使用内核对象进行线程同步
使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...
- windows核心编程---第三章 内核对象及句柄本质
本章讨论的是相对抽象的概念,不涉及任何具体的内核对象的细节而是讨论所有内核对象的共有特性. 首先让我们来了解一下什么是内核对象.内核对象通过API来创建,每个内核对象是一个数据结构,它对应一块内存 ...
- Windows API学习---线程与内核对象的同步
前言 若干种内核对象,包括进程,线程和作业.可以将所有这些内核对象用于同步目的.对于线程同步来说,这些内核对象中的每种对象都可以说是处于已通知或未通知的状态之中.这种状态的切换是由Microsoft为 ...
随机推荐
- solr5.5教程-solrconfig.xml,加载schema.xml
布署完成后,接下来要更深入的研究solr的原理和使用. 首先进入testcore这个文件夹下面,发现这个core的conf里并没有schema.xml.那么数据格式是在哪里定义的呢? 打开 solr_ ...
- Does FTK index search support regular expression?
Some of my friends ask me a question: "Does FTK index search support regular expression?" ...
- c89和c99的区别【转】
//本文转自:http://www.360doc.com/content/10/0324/18/2633_20101093.shtml 注: GCC支持C99, 通过 --std=c99 命令行参数开 ...
- oracle 强杀进程
在ORACLE数据库当中,有时候会使用ALTER SYSTEM KILL SESSION 'sid,serial#'杀掉一个会话进程,但是使用这个SQL语句杀掉会话后,数据库并不会立即释放掉相关的资源 ...
- 017Makefile工程管理
1.为什么需要Makefile? 利用Makefile和make的合作,可以把很多很多的工作合并成一个非常简单的命令:make: make能够使整个程序的编译.链接只需要一个命令(make)就可以完成 ...
- Linux ssh exit,启动的后台进程不会停止
一般情况下,想要通过终端长时间运行任务,需要使用nohup 或者 screen,如果不使用会怎么样呢?来测试一下 描述: 场景1:ssh登录机器,通过添加(&),启动任务到后台,通过exi ...
- Objective-C控制语句
Objective-C控制语句有以下三类: 分支语句:if-else,switch 循环语句:while,do-while,for 与程序转移相关的跳转语句:break,continue,goto. ...
- C#winform初试报表
步骤1.新建一个窗口,拖一个ReportViewer控件上去,设置该控件的Dock为Fill. 步骤2.添加一个报表文件,如:Report1.rdlc,设置其中的参数,这里设置的参数和下面的代码里面的 ...
- jquery Ajax中的dataType简析
jquery中的ajax有好几种运用方式,但是基本上都是使用的$.ajax()方法,很多人经常会使用它来从后台获取json格式的数据,但是经常发现返回的json字符串并不能自动的转换成js里的json ...
- 定时重启Apache与MySQL方法
可以定时重启apache服务器等.让网站运行的效果更快. 采用at命令添加计划任务. 有关使用语法可以到window->“开始”->运行“cmd”->执行命令“at /”,这样界面中 ...