最近有个项目需要实时的传输并计算一些数据,为了缩短时间,打算用一个定时器接受数据,数据更新后调用响应函数计算。
matlab的定时器类网上有很多介绍,但是addlistener这个函数提到的不多,它可以创建绑定到事件源的事件侦听程序。官方说明中有两个调用方式
el = addlistener(hSource,EventName,callback) 为源对象 hSource 上触发的事件 EventName 创建侦听程序。
如果 hSource 是数组,侦听程序将响应 hSource 数组中任何对象上的指定事件。callback 是引用回调函数的函数句柄。
el = addlistener(hSource,PropertyName,EventName,callback) 为某个预定义的属性事件创建侦听程序。有四个预定义的属性事件:
事件名称 事件发生 PreSet 在设置属性值之前、调用它的 set 访问方法之前立即触发 PostSet 在属性值设置之后立即触发 PreGet 在提供属性值查询服务之前、调用它的访问方法之前立即触发 PostGet 在将属性值返回到查询后立即触发
这里并没有说明callback函数需要传入参数的方法,它也不能像定时器一样通过{@myf, arg1, arg2}来使用,网上找半天没找到,因为我是在matlab中的app designer中使用,函数调用必须得有app对象 ,自己用的函数句柄总是出错,后来通过listener才找到具体用法。
Here is the syntax for an ordinary method. The input arguments (
arg1,...argn
) must be defined in the context in which you calladdlistener
.lh = addlistener(src,'EventName',@(src,evnt)obj.callbackMethod(src,evnt,arg1,...argn)Use varargin to define the callback function.
function callbackMethod(src,evnt,varargin) arg1 = varargin{1}; ... argn = varargin{n}; ... end
src和evnt好像是必须的,我在app的methed中定义了函数mylistener将app作为最后参数又传了一边,因为作为第一个参数好像不能访问。
%调用的函数
function mylistener(~,~,~,varargin)
aL1 = varargin{1};
acamMatrix1 = varargin{2};
assize = varargin{3};
acolor_RGB = varargin{4};
aa = varargin{5};
reproj_auto(aL1,acamMatrix1,assize,acolor_RGB,aa);
end
%建立侦听
addlistener(app,'x','PostSet',@(src,evnt)app.mylistener(app,evnt,L1,camMatrix1,ssize,color_RGB,app));
另外:x属性需要声明为SetObservable。
properties (SetObservable)
x
y
end