ACE_Event_Handler:事件响应入口
1:ACE_Event_Handler类
头文件“Event_Handler.h”
在ACE Reactor框架中,ACE_Event_Handler是所有事件处理器的基类。ACE_Event_Handler提供了一组事件处理的挂钩方法,理解和掌握这些挂钩方法的触发条件和使用方法,是ACE Reactor编程装B道路的重点。先看一下ACE_Event_Handler提供的关键方法:
2:举个栗子
1:A从B那里下了订单,要求B每天送一份货物至A提供的地址。该过程类似于在ACE_Reactor::register_handler()上注册一个事件,注册的事件类型相当于收货地址(Reactor会根据注册的事件类型调用对应的挂钩方法),register_handler的第一个参数是ACE_Event_Handler指针,第二个参数是注册的事件类型,见下图:
register_handler注册了哪个事件,当该类型事件发生时,ACE_Reactor就会调用对应的挂钩方法,比如READ_MASK对应handle_input方法。没有注册的事件类型是不会触发对应方法的。PS:ACE_Event_Handler::RWE_MASK等价于READ+WRITE+EXCEPT。
ACE_Reactor::instance()->register_handler(this,ACE_Event_Handler::RWE_MASK);
2:仅有收货地址是不够的,还需要指定收货人。由于ACE_Event_Handler是虚基类,我们需要在子类中提供收货人实体。假设需要接收的物品为数据流,可以定义实体ACE_SOCK_Stream m_Peer。将ACE_SOCK_Stream收货人信息通知给某宝的方法是get_handle,使用方法如下:
ACE_HANDLE CClass::get_handle (void) const
{
return m_Peer.get_handle ();
};
3:某君A收到了货物,试用了后觉得还不错,B继续送;或者通知B不要再送该类物品。
对于情况1,在ACE_Event_Handler的handle_*()方法中返回大于等于0的int值。对于情况2,在handle_*()方法中返回-1,ACE_Reactor将会通知handle_close()方法进行后续处理,并清除掉步骤1中register_handler对应的mask值。handle_*()各类方法的原型函数如下:
/// Called when input events occur (e.g., connection or data).
virtual int handle_input (ACE_HANDLE fd = ACE_INVALID_HANDLE); /// Called when output events are possible (e.g., when flow control
/// abates or non-blocking connection completes).
virtual int handle_output (ACE_HANDLE fd = ACE_INVALID_HANDLE); /// Called when an exceptional events occur (e.g., SIGURG).
virtual int handle_exception (ACE_HANDLE fd = ACE_INVALID_HANDLE); /**
* Called when timer expires. @a current_time represents the current
* time that the Event_Handler was selected for timeout
* dispatching and @a act is the asynchronous completion token that
* was passed in when <schedule_timer> was invoked.
*/
virtual int handle_timeout (const ACE_Time_Value ¤t_time,
const void *act = ); /// Called when a process exits.
virtual int handle_exit (ACE_Process *); /// Called when a handle_*() method returns -1 or when the
/// remove_handler() method is called on an ACE_Reactor. The
/// @a close_mask indicates which event has triggered the
/// handle_close() method callback on a particular @a handle.
virtual int handle_close (ACE_HANDLE handle,
ACE_Reactor_Mask close_mask); /// Called when object is signaled by OS (either via UNIX signals or
/// when a Win32 object becomes signaled).
virtual int handle_signal (int signum, siginfo_t * = , ucontext_t * = );
ps1:handle_close()的返回值将会被忽略。
ps2:handle_close()在两种情况下被触发:1,handle_*()方法返回-1;2,调用ACE_Reactor::remove_handler()。
4:A从B那里解除合约订单,调用ACE_Reactor::register_handler()相反的操作ACE_Reactor::remove_handler()。如果不希望remove_handler会触发handle_close()方法,可以在mask值加上DONT_CALL标识位:
ACE_Reactor::instance()->remove_handler(this,ACE_Event_Handler::RWE_MASK | ACE_Event_Handler::DONT_CALL);
读书笔记:C++ Network Programming Volume2 Systematic Reuse with ACE and Frameworks
ACE_Event_Handler:事件响应入口的更多相关文章
- 追踪app崩溃率、事件响应链、Run Loop、线程和进程、数据表的优化、动画库、Restful架构、SDWebImage的原理
1.如何追踪app崩溃率,如何解决线上闪退 当 iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上.crash日志上有很多有用的信息,比如每个正在执行线程的完整堆栈 跟踪信 ...
- 【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)
一. iOS 项目简介 1. iOS 文件简介 创建一个 HelloWorld 项目, 在这个 IOS 项目中有四个目录 : 如下图; -- HelloWorldTests 目录 : 单元测试相关的类 ...
- Android学习之六种事件响应方法汇总
java源码如下: 1.MainActivity.java源码 package com.example.responsetest; import android.app.Activity; impor ...
- iOS事件响应链
首先,当发生事件响应时,必须知道由谁来响应事件.在IOS中,由响应者链来对事件进行响应,所有事件响应的类都是UIResponder的子类,响应者链是一个由不同对象组成的层次结构,其中的每个对象将依次获 ...
- DuiLib事件分析(一)——鼠标事件响应
最近在处理DuiLib中自定义列表行元素事件,因为处理方案得不到较好的效果,于是只好一层一层的去剥离DuiLib事件是怎么来的,看能否在某一层截取消息,自己重写. 我这里使用CListContaine ...
- mvc ajax dropdownlist onchang事件响应
<script type="text/javascript"> $("#Cycle").on("change", functio ...
- Legolas工业自动化平台入门(三)交互事件响应动作
在上一篇Legolas工业自动化平台入门(二)数据响应动作 一文中,我们介绍了"动作"相关内容,了解到"动作"分为多种,各种动作的添加方式相同,但是应用方式各自 ...
- JS代码的位置与事件响应代码块的封装问题
JS代码的位置 我们可以将JavaScript代码放在html文件中任何位置,但是我们一般放在网页的head或者body部分. 放在<head>部分最常用的方式是在页面中h ...
- Android MotionEvent事件响应机制
在android中,事件主要包括点击.长按.拖曳.滑动等操作,这些构成了Android的事件响应,总体来说,所有的事件都由如下三个部分作为基础构成: 按下(action_down),移动(action ...
随机推荐
- Struts2中的一个类型转换示例
1.写一个属性文件,里面写好需要转换的类型数据,xwork-conversion.properties,解释: xwork-conversion.properties表示对所有action中的指定数据 ...
- unity笔录
----------------------------unity项目在启动splash的时候黑屏 原因不明------------------测试复制项目 用剔除法测试 笔录开始 先用原版本打包 ...
- SQL in优化将In转化为联合查询
in查询有时候会非常影响性能,最好能转化为联合查询,但有的网友说sqlserver会自动将in转化为联合查询,但我实际遇到的有时候却不是这样.所以最好还是不要用in. 我自己的例子,用in的时候耗费了 ...
- 《JavaScript高级程序设计》读书笔记 ---RegExp 类型
ECMAScript 通过RegExp 类型来支持正则表达式.使用下面类似Perl 的语法,就可以创建一个正则表达式.var expression = / pattern / flags ; 其中的模 ...
- proc中tran的一般处理
存储过程事物的处理 一般情况在proc中判断的处理我们都采用 ) begin select '错误' return end 而在tran中我们最好用抛异常的方式 begin try begin SET ...
- openstack私有云布署实践【13.1 网络Neutron-compute节点配置(科兴环境)】
所有kxcompute节点 下载安装组件 # yum install openstack-neutron openstack-neutron-linuxbridge ebtables ipset ...
- JSON及与XML比较
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - Decem ...
- POIXV Permutation
Description Multiset is a mathematical object similar to a set, but each member of a multiset may ha ...
- 复习i++和++j
一,新建一个Default.aspx页面 在Default.aspx.cs
- php 语音参考
如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记.这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,而脚本中此时并无输出的意图. ...