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的生命周期绑定了。 |
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |