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 &current_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:事件响应入口的更多相关文章

  1. 追踪app崩溃率、事件响应链、Run Loop、线程和进程、数据表的优化、动画库、Restful架构、SDWebImage的原理

    1.如何追踪app崩溃率,如何解决线上闪退 当 iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上.crash日志上有很多有用的信息,比如每个正在执行线程的完整堆栈 跟踪信 ...

  2. 【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)

    一. iOS 项目简介 1. iOS 文件简介 创建一个 HelloWorld 项目, 在这个 IOS 项目中有四个目录 : 如下图; -- HelloWorldTests 目录 : 单元测试相关的类 ...

  3. Android学习之六种事件响应方法汇总

    java源码如下: 1.MainActivity.java源码 package com.example.responsetest; import android.app.Activity; impor ...

  4. iOS事件响应链

    首先,当发生事件响应时,必须知道由谁来响应事件.在IOS中,由响应者链来对事件进行响应,所有事件响应的类都是UIResponder的子类,响应者链是一个由不同对象组成的层次结构,其中的每个对象将依次获 ...

  5. DuiLib事件分析(一)——鼠标事件响应

    最近在处理DuiLib中自定义列表行元素事件,因为处理方案得不到较好的效果,于是只好一层一层的去剥离DuiLib事件是怎么来的,看能否在某一层截取消息,自己重写. 我这里使用CListContaine ...

  6. mvc ajax dropdownlist onchang事件响应

    <script type="text/javascript"> $("#Cycle").on("change", functio ...

  7. Legolas工业自动化平台入门(三)交互事件响应动作

    在上一篇Legolas工业自动化平台入门(二)数据响应动作 一文中,我们介绍了"动作"相关内容,了解到"动作"分为多种,各种动作的添加方式相同,但是应用方式各自 ...

  8. JS代码的位置与事件响应代码块的封装问题

    JS代码的位置       我们可以将JavaScript代码放在html文件中任何位置,但是我们一般放在网页的head或者body部分.   放在<head>部分最常用的方式是在页面中h ...

  9. Android MotionEvent事件响应机制

    在android中,事件主要包括点击.长按.拖曳.滑动等操作,这些构成了Android的事件响应,总体来说,所有的事件都由如下三个部分作为基础构成: 按下(action_down),移动(action ...

随机推荐

  1. Ubuntu14.04浏览器Firefox安装flash播放插件

    sudo apt-get update sudo apt-get install flashplugin-nonfree ================= 类飞秋软件 sudo apt-get in ...

  2. spring Bean的三种注入方式

    1.构造函数注入: 构造函数的注入方式分为很多种 (1)普通构造函数,空参数的构造函数 <bean id="exampleBean" class="examples ...

  3. redis超时问题分析

    redis超时问题分析 06/04. 2014 Redis在分布式应用中占据着越来越重要的地位,短短的几万行代码,实现了一个高性能的数据存储服务.最近dump中心的cm8集群出现过 几次redis超时 ...

  4. HTTPS详解

    HTTPS(Hypertext Transfer Protocol over Secure Socket Layer,基于SSL的HTTP协议)使用了HTTP协议,但HTTPS使用不同于HTTP协议的 ...

  5. 微信小程序开发详解——小程序,大颠覆!

    微信小程序开发 联系 苏念 188.1414.7927  微信小程序系统开发 微信新功能开发 小程序开发 小程序怎么开发 app小程序开发 简化小程序开发 微信小程序定制 小程序制作 开发微信小程序  ...

  6. WPF之DatePicker使其只能选择日期,不能输入日期

    <DatePicker.Resources>  <Style TargetType="DatePickerTextBox">           <S ...

  7. 分布式版本控制系统Git-----5.Git 的push命令总结

    git push git push命令用于将本地分支的更新,推送到远程主机.它的格式与git pull命令相仿. git push <远程主机名> <本地分支名>:<远程 ...

  8. 《JS权威指南学习总结--第六章 对象》

    内容要点: 一.对象定义 对象是JS的基本数据类型.对象是一种复合值:它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值. 对象也可看做是属性的无序集合,每个属性都是一个名/值对. 属性 ...

  9. mysql分页

    1.查询第一行记录: select * from table limit 1 2.查询第n行到第m行记录 select * from table1 limit n-1,m-n; SELECT * FR ...

  10. jQuery第六章

    jQuery与Ajax应用 一.Ajax的优势和不足 1.Ajax的优势: (1)不需要插件支持:不需要任何浏览器插件就可以被绝大多数浏览器支持 (2)优秀的用户体验:能在不刷新整个页面的前提下更新数 ...