QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 842|回复: 1
打印 上一主题 下一主题

听众的几种创建方式

[复制链接]
字体大小: 正常 放大

2620

主题

162

听众

1万

积分

升级  0%

  • TA的每日心情
    开心
    2015-3-12 15:35
  • 签到天数: 207 天

    [LV.7]常住居民III

    社区QQ达人 发帖功臣 新人进步奖 优秀斑竹奖 金点子奖 原创写作奖 最具活力勋章 助人为乐奖 风雨历程奖

    群组第六届国赛赛前冲刺培

    群组国赛讨论

    群组2014美赛讨论

    群组2014研究生数学建模竞

    群组数学中国试看培训视频

    跳转到指定楼层
    1#
    发表于 2014-12-30 10:41 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    MATLAB中有两种方式来创建听众:一种是利用handle类中的addlistener函数来创建听众;另一种是直接利用event.listener类(听众类)的构造函数来创建听众。
    (1)用addlistener创建听众
    使用这种方式时,该函数会同时将所创建的听众与某个产生事件的对象生命周期相绑定。关于用addlistener创建听众的过程在上一小节中说明了,这里再举例说明其使用方法。
    例如:
    L1 = addlistener(MClock_obj,'Alarm', @MClockFun.listenMyEvent)
    将为Mclock_obj对象的事件Alarm创建一个听众,并且注册相应的回调函数listenMyEvent。
    又如:
    L2= addlistener(MClock_obj, 'Enable','PostSet', @MClockFun.listenMyEvent)
    将为Mclock_obj对象创建一个PostSet听众,并且注册相应的回调函数listenMyEvent。
    (2)用event.listener类的构造函数创建听众
    一般情况下创建一个听众可以使用addlistener函数。我们也可以直接调用event.listener类的构造函数来创建听众。在这种方式下,所创建的听众不与产生事件的对象生命周期相绑定,而是与听众对象相关联。只要在听众对象的作用域范围内且没有被删除,则听众总是有效的。
    event.listener类是一个handle型类,其作用是来创建听众,并将创建的听众响应指定的事件,当事件触发时调用关联的回调函数。创建听众的格式为:
    lh = event.listener(Hobj,'EventName',@CallbackFunction)
    上面的命令为Hobj对象中的事件EventName创建了一个event.listener型听众lh。如果Hobj是一个对象数组的句柄,则该听众会响应数组中任何一个对象的EventName事件。而CallbackFunction是关联的回调函数。这里的回调函数至少应接收两个输入参数,如:
    function CallbackFunction(source,eventData)
       ...
    end
    这里source应是产生事件的对象,eventData是event.EventData类对象。
    例8-1  为MClock类的对象创建一个event.listener听众。
    解:程序代码如下。
    function main()   
        hobj=MClock;
        hl = event.listener(hobj,'Alarm',@CallbackFunction);
        hobj.AlarmSetChange(1);
    end
    function CallbackFunction(source,eventData)
        alarm=source.Enable
        disp('响应事件Alarm了');  %用来检验该函数是否调用
    end
    其中main函数中的hobj是MClock对象,hl是听众句柄,CallbackFunction是与该听众关联的回调函数。
    上面的代码运行结果是:
    alarm =1
    响应事件Alarm了
    在上面的代码中,我们可以设置Enabled为false来关闭对回调函数的调用,例如:
    lh.Enabled = false;
    而使用如下命令时,就不会去调用回调函数CallbackFunction:
      hobj.AlarmSetChange(1);
    注意:采用这种方法创建的听众其作用域范围与addlistener函数创建的听众有所不同,前者只有在创建该听众的作用域内有效。例如,看看下面的程序,可以比较出它们的不同。
    function main()
       clear all
       clc
       hobj=MClock(0);
       fun(hobj);
       hobj.AlarmSetChange(1);
    end
    function fun(hobj)
    %以下听众对象作用域仅限于这个函数体
       event.listener(hobj,'Alarm',@CallbackFunction);
    %以下产生的听众对象作用域是全局的
       %addlistener(hobj,'Alarm',@CallbackFunction);
    end
    function CallbackFunction(source,eventData)
       alarm=source.Enable
       disp('响应事件Alarm了');  %用来检验该函数是否调用
    end
    在fun函数中当采用event.listener创建听众时,由于其作用域仅限于该函数体内,因此在main函数中无效;而改用addlistener创建的听众,则在main函数中有效,这是由于它与事件对象hobj的生命周期绑定了。


    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

    0

    主题

    7

    听众

    705

    积分

    升级  26.25%

  • TA的每日心情

    2017-5-7 16:58
  • 签到天数: 366 天

    [LV.9]以坛为家II

    邮箱绑定达人 社区QQ达人

    群组2012HIMCM培训群组

    群组第四届数学中国美赛实

    群组第三届数模基础实训

    群组高数系列公益培训

    群组物联网工程师培训

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-5-22 21:21 , Processed in 0.447948 second(s), 55 queries .

    回顶部