`
litaocheng
  • 浏览: 337743 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

gen_event 讲解

阅读更多
OTP中,事件管理器(event manager)用来接收事件,这里的事件非常广泛,可以为错误,警告各种各样erlang允许的信息。
事件管理器拥有零个或多个事件处理器(event handler)。当事件管理器收到一个事件时,此事件会被管理器内部安装的所有处理器处理。
其实在事件管理器(gen_event behaviour)中,拥有一个[{Module, State}],其保存安装的处理器(Module模块)及对应的状态。当收到事件时,管理器遍历调用Module的
Module:handle_event/2函数进行处理。

callbacks接口
1. init(InitArg)
处理器安装后,进行初始化,返回Module对应的状态
2. handle_event(Event, State)
处理各种event
3. handle_call(Request, State)
处理同步调用
4. terminate(Arg, State)
处理器被删除或事件管理器停止时,Module调用terminate
完成详细规范请参考erlang man手册

example-日志记录模块,保存最近的5条错误日志

-module(recent_logger).
-behaviour(gen_enevt).

-export([start/0, stop/0, log/1, report/0, release/0])

%% gen_event callbacks
-export([init/1, handle_event/2, handle_call/2, terminate/2]).
-define(NAME, logger_manager).

%% start behaviour
start() ->
	case gen_event:start_link({local, ?NAME}) of
		Ret = {ok, _Pid} ->
			gen_event:add_handler(?NAME, ?MODULE, []),
			Ret;
		Other ->
			Other
	end.

%% stop
stop() ->
	gen_envent:stop(?NAME).

%% notify an envent about log
log(E) ->
	gen_enevt:notify(?NAME, {log, E}).

%% report the all log
report() ->
  gen_event:call(?NAME, ?MODULE, report).

%% release this handler
release() ->
  gen_event:delete_handler(?NAME, ?MODULE, release).

init(_Arg) ->
	io:format("start recent log handler~n"),
	{ok, []}.

handle_event({log, E}, List) ->
	{ok, trim([E | List])}.

handle_call(report, List) ->
  List.

terminate(stop, _List) ->
	io:format("recent log handler stop~n"),
	ok;
terminate(release, _List) ->
	io:format("recent log handler release~n"),
	ok.

%% save the recent five log
trim([E1, E2, E3, E4, E5 | []) ->
	[E1, E2, E3, E4, E5];
trim(List) ->
	List.



gen_event使用
1. 启动gen_event
gen_event:start_link({local, ?NAME})用来启动命名为?NAME所表示宏的事件管理器。
同gen_server一样,命名可以为{global, ?NAME}或者没有命名使用Pid交互。此模块作为supervision tree的worker时,必须使用start_link启动,
而单独应用可以使用start

2. 添加一个handler
gen_event:add_handler(?NAME, ?MODULE, [])将本Module作为一个handler添加到事件管理器中,函数内部会调用Module:init/1函数,其中参数为
add_handler/3的第三个参数。

3. 通知一个事件
当我们想要事件管理器记录一个日志时,我们通过gen_enevt:notify(?NAME, {log, E}).向事件管理器发送一个事件,这样事件管理就会依次调用其内部
安装的所有处理器处理此事件,并更新对应处理器的状态。具体的处理过程在Module的handle_event/2中进行。此处是{ok, trim([E | List])}保存日志消息。

4. 删除一个事件
gen_event:delete_handler(?NAME, ?MODULE, [])我们将?MODULE指定的处理器删除,其中会调用Module:terminate/2进行清除。

5. 同步调用
gen_server:call(?NAME, ?MODULE, report)用来进行同步调用,需要注意的是:此函数不同于gen_enevt:notify/2,其拥有三个参数,第二个参数用来指明调用那个事件处理器进行处理此请求,而notify是通知所有的事件处理器某个事件,因此这里是不同的。
函数调用Module:handle_call/2返回结果,这里直接返回保存的log List

6. 停止事件管理器
如果事件管理器应用在supervision tree中,不需要提供stop函数,监督树会自动清除事件管理器。如果是单独的应用,需要调用 gen_envent:stop(?NAME)停止事件管理器。
此处与gen_server相似,具体参考supervision shutdown strategy

通过上面的描述,您对gen_enevt熟悉了么?把example代码自己书写一遍,理解会更深刻!
分享到:
评论
1 楼 cheng02 2012-08-30  
5、的第一句打错了,gen_server:call应该是gen_event:call

相关推荐

    gen_lex_hash_pc

    《gen_lex_hash_pc:MySQL交叉编译的关键工具详解》 在IT行业中,数据库管理系统是核心组件之一,而MySQL作为开源关系型数据库的代表,广泛应用于各类项目中。在特定环境下,如嵌入式设备或资源有限的PC平台,我们...

    Gen_Signature_Android2

    标题"Gen_Signature_Android2"指的是一个特定的工具,它用于生成Android应用的签名,这通常是在发布应用到Google Play或其他第三方市场之前所必需的步骤。这个工具可能是为简化开发者的工作流程而设计的,使得他们...

    Gen_Signature_Android2.zip

    标题“Gen_Signature_Android2.zip”中的"Gen_Signature"指的是生成签名的过程,而"Android2"可能表示这是针对Android平台的第二个版本的工具或方法。这个压缩包文件包含一个名为"Gen_Signature_Android2.apk"的应用...

    Gen_Signature_Android 签名解析工具

    Gen_Signature_Android是一个专门用于Android应用签名解析的工具,它可以帮助开发者和安全研究人员深入理解APK文件的签名机制,以及验证APK的签名信息。下面将详细介绍Android应用的签名过程、签名的重要性以及如何...

    srio_response_gen_srio_gen2_0_srio_gen_srio_reponse_SRIO_gen2_SR

    标题 "srio_response_gen_srio_gen2_0_srio_gen_srio_reponse_SRIO_gen2_SR" 提到的是一个与SRIO(Serial RapidIO)相关的响应生成模块,它可能是一个硬件描述语言(如Verilog或VHDL)设计的源代码文件。SRIO是一种...

    Gen_Signature_Android.apk

    《Android应用签名详解——以Gen_Signature_Android.apk为例》 在移动应用开发领域,尤其是Android系统中,应用的签名是确保软件安全性和完整性的关键环节。本篇文章将详细探讨Android应用签名的重要性、原理以及...

    MKS Gen_L主板 使用手册

    ### MKS Gen_L 主板关键知识点解析 #### 一、简介 MKS Gen_L 主板是针对原有 Ramps1.4 开源主板存在的问题而设计的一款优化产品。它结合了 Arduino 2560 和 Ramps1.4 的功能,旨在提供更为稳定且易于使用的解决方案...

    gen_tags.vim, 用来轻松使用 ctags/gtags的vim和neovim的异步插件.zip

    gen_tags.vim, 用来轻松使用 ctags/gtags的vim和neovim的异步插件 gen_tags.vim 为方便用户使用 Vim/ NeoVim,简化了 ctags/ gtags的使用。它用于为你生成和维护多个平台支持的标签,在 Windows/Linux/macOS. 上测试...

    gen_server tasting 之超简单名称服务(续)

    在IT行业中,`gen_server`是Erlang OTP(开放电信平台)框架中的一个核心组件,它提供了一种模式化的方式来实现服务器进程。本篇博客“gen_server tasting 之超简单名称服务(续)”主要探讨了如何使用gen_server来...

    PyPI 官网下载 | gen_data_model-1.6.1.tar.gz

    《PyPI官网下载:gen_data_model-1.6.1.tar.gz详解》 在Python的开发过程中,包管理器PyPI(Python Package Index)扮演着至关重要的角色,它为开发者提供了一个集中化的地方来发布、查找和安装Python库。本文将...

    华硕Z87主板BIOS_updater_for_4th_Gen_Intel_Core_CPU.zip

    这个“华硕Z87主板BIOS_updater_for_4th_Gen_Intel_Core_CPU.zip”压缩包就是用于更新该主板BIOS的工具,以确保与最新硬件和软件的兼容性,解决潜在问题,提高系统的稳定性和性能。 BIOS更新通常包含以下好处: 1. ...

    gen_lyricist.dll

    gen_lyricist.dll 万能播放器仿千千静听

    crc_gen_para_8_ip_crc-gen_verilogIP_crc_

    在本文中,我们将深入探讨标题为“crc_gen_para_8_ip_crc-gen_verilogIP_crc_”的Verilog HDL实现的CRC校验IP核。这个IP核专门设计用于生成8位参数化的CRC码,适用于多种通讯协议的校验计算。 首先,让我们理解CRC...

    gen_table自动从txt生成表格读写代码

    `gen_table`从txt文件自动生成表格读写代码的功能,为开发者提供了极大的便利,能够快速有效地将文本数据转化为结构化的表格形式,并且支持读取和写入操作。下面我们将详细探讨这一主题。 首先,`gen_table`工具或...

    FPGA_program.rar_RTlab_Xilinx_fpga的PROGRAM_fpga的dist_mem_gen_svp

    "dist_mem_gen_svp"是Xilinx提供的一个工具或IP核,全称为分布式内存生成器(Distributed Memory Generator)。这个工具主要用于创建FPGA内部的分布式RAM,它可以根据用户的需求定制大小、访问模式、数据宽度等参数...

    pwm_gen_pwmgen_PWM_gen_

    pwm_gen,PWN波形发生器,开关波形

    基于Erlang的gen_tcp聊天室代码,功能完整

    基于Erlang的gen_tcp库是其强大的网络编程接口,用于实现TCP协议的应用。在这个场景中,我们讨论的是一个使用Erlang和gen_tcp编写的聊天室应用。 **gen_tcp简介** gen_tcp是Erlang OTP(开放电信平台)提供的一种...

    gen_java_takeznh_android_

    "gen_java_takeznh_android_"项目提供了一个实现这种效果的源码示例,它具有彩色的交互式导航选项卡栏。这个项目主要使用了Java语言,并且与takeznh开发者有关。下面将详细探讨该项目中的关键知识点。 首先,`...

Global site tag (gtag.js) - Google Analytics