使用事件(Event)进行进程同步
2012-03-30 10:00
239 查看
前一篇文章写了使用信号量进行进程同步,不过很显然,信号量更适合用于资源控制的场合,如果单纯为了进行同步控制,使用事件(Event)更加简洁和方便。
事件的控制比信号量更为简单,没有最大资源计数和当前资源计数的属性,而只有是否触发这一属性,直接贴代码:
控制进程:
HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, "Robots_Sync_Signal");
//......某些操作
SetEvent(hEvent);
同步进程:
HANDLE hEvent = OpenEvent(SYNCHRONIZE, FALSE, "Robots_Sync_Signal");
if(hEvent != NULL)
cout<<"Event Openned!"<<endl;
else
{
cout<<"Error Openning Event"<<endl;
cout<<"Last Error: "<<GetLastError()<<endl;
cin>>ch;
exit(0);
}
WaitForSingleObject(hEvent, INFINITE); //等待信号量触发
cout<<"Got Event!"<<endl;
//......同步以后的操作
//Close Event Handle
CloseHandle(hEvent);
注意,这里打开事件内核对象的时候,权限只用了SYNCHRONIZE,这是因为同步进程只需要等待触发,而不需要释放资源,或者对事件做处理。当然,如果需要Set或Reset事件,也是可以的,只要增加EVENT_MODIFY_STATE权限即可。
关于内核对象的访问权限,见MSDNhttp://msdn.microsoft.com/zh-cn/library/ms686670(v=vs.85).aspx
事件的控制比信号量更为简单,没有最大资源计数和当前资源计数的属性,而只有是否触发这一属性,直接贴代码:
控制进程:
HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, "Robots_Sync_Signal");
//......某些操作
SetEvent(hEvent);
同步进程:
HANDLE hEvent = OpenEvent(SYNCHRONIZE, FALSE, "Robots_Sync_Signal");
if(hEvent != NULL)
cout<<"Event Openned!"<<endl;
else
{
cout<<"Error Openning Event"<<endl;
cout<<"Last Error: "<<GetLastError()<<endl;
cin>>ch;
exit(0);
}
WaitForSingleObject(hEvent, INFINITE); //等待信号量触发
cout<<"Got Event!"<<endl;
//......同步以后的操作
//Close Event Handle
CloseHandle(hEvent);
注意,这里打开事件内核对象的时候,权限只用了SYNCHRONIZE,这是因为同步进程只需要等待触发,而不需要释放资源,或者对事件做处理。当然,如果需要Set或Reset事件,也是可以的,只要增加EVENT_MODIFY_STATE权限即可。
关于内核对象的访问权限,见MSDNhttp://msdn.microsoft.com/zh-cn/library/ms686670(v=vs.85).aspx
相关文章推荐
- Linux下通过共享内存进行进程间通信,进程间同步使用信号量来实现
- 在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信
- Windows进程同步之事件内核对象(Event)
- Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
- Linux下通过共享内存进行进程间通信,进程间同步使用信号量来实现
- 【Unity3D技巧】在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信
- linux进程间的通信(C): 使用信号量进行同步的共享内存机制
- delphi OnMouseLeave 事件不灵敏及解决之道(使用TrackMouseEvent函数进行加强)
- Qt使用一个事件队列对所有发出的事件进行维护(QObject的event()函数相当于dispatch函数),用EventLabel 继承QLabel作为例子(简单明了) good
- Unity3D技巧在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信
- 使用EventWaitHandleSecurity进行程序间同步时,在非英语机器上程序hang住了。
- 网络编程(40)—— 使用信号量semaphore进行多进程间的同步
- Windows进程同步之事件内核对象(Event)
- 一起talk C栗子吧(第一百零一回:C语言实例--使用信号量进行进程间同步与互斥二)
- 一起talk C栗子吧(第一百零二回:C语言实例--使用信号量进行进程间同步与互斥三)
- 【Unity3D技巧】在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信 (二) : 引入中间层NotificationCenter
- linux进程间的通信(C): 使用信号量进行同步的共享内存机制
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。