2011-09-13 52 views
2

似乎MATLAB句柄一次不会响应来自同一个源的多个通知。不幸的是,这对我来说是个大问题。下面是我在说什么的例子:MATLAB嵌套事件通知?

classdef testClass < handle 
    events 
     testevent 
    end 

    methods 
     function obj = testClass 
      obj.addlistener('testevent', @obj.respond); 
     end 
     function raise(obj) 
      obj.notify('testevent'); 
     end 
     function respond(obj, varargin) 
      fprintf('Responded!\n'); 
      obj.raise(); 
     end 
    end 

end 

当我执行的代码

c = testClass; 
c.raise(); 

结果是

Responded! 

但我真正想要的递归工作,虽然显然在这个简单的例子中,它会无限递归。有没有办法得到这种行为?

回答

3

通过将侦听器句柄的Recursive属性设置为true,可以使侦听器递归。 Listener handle properties are in the event.listener help page。你只需要指定一个输出参数到obj.addlistener来检索句柄。

这是我用来做它的代码工作:

classdef testClass < handle 
    events 
     testevent 
    end 

    methods 
     function obj = testClass 
      lh = obj.addlistener('testevent', @obj.respond); 
      lh.Recursive = true; 
     end 
     function raise(obj) 
      notify(obj,'testevent'); 
     end 
     function respond(obj, varargin) 
      fprintf('Responded!\n'); 
      obj.raise(); 
     end 
    end 
end 

还要注意的是有500个呼叫的默认递归限制,所以天真的代码不会无限复发;使用set(0, 'RecursionLimit', N)来改变它。我认为设置N=inf是一个坏主意。

+0

太棒了!谢谢,那正是我需要的! – rlbond

+0

你已经度过了我的一天! – CitizenInsane