鉴于Matlab中缺乏多线程机制,使用Timer无疑是一个很重要的工具,Matlab中Timer是一个Java对象。
Timer的定义
t=timer();
设置属性:
eg. set(t,'Name','your_timer_name');
当然可以一次性设置完成:
例如:
TaskTimer=timer(...
'Name','FebirdTimer',...
'TimerFcn',@ExecuteTask,...
'ErrorFcn',@ExecuteError,...
'Period',1,...
'ExecutionMode','fixedrate');
这里TimerFcn为Timer执行的函数,后面的 ‘@ExcuteTask’ 就是你定义的函数名
同样 ErrorFcn也是一样。
Period为执行周期,ExecutionMode为执行模式,fixedrate为固定频率。当然前面所说的都是在这个前提之上。
关于TimerFcn的定义
当以TimerFcn的定义默认必须有两个参数
function ExcuteTask(obj,eventdata)
% TODO
end
其中obj为执行该函数所对应的timer对象,eventdata为事件数据,一般里面为具体时间。
当需要在ExcuteTask中传入参数的时候,那么Timer可以这样定义:
set(t,'TimerFcn',{@ExecuteTask,var1});
那么这时函数定义应该为:
function ExcuteTask(obj,eventdata,var1)
% TODO
end
其他函数的定义也类似。
关于UserData
UserData在Timer比较有用,因为当时用上面的方法传递参数是,Matlab只会在第一次传入参数。
所以我们可以在UserData这个域中保存我们的数据
例如
t=[0]
lh=plot(t,sin(t),'-');
t=timer(...
'Name','FebirdTimer',...
'TimerFcn',@ExecuteTask,...
'ErrorFcn',@ExecuteError,...
'Period',1,...
'ExecutionMode','fixedrate');
ud=struct{'linehanle',lh,'count',0} ;
set(t,'UserData',ud);
function ExcuteTask(obj,eventdata)
ud=obj.UserData;
l=ud.linehandle;
c=ud.count;
t=get(l,'XData');
y=get(l,'YData');
t=[t count];
y=[y sin(0.1*count)];
set(lh,'XData',t,'YData',y);
drawnow
ud.count=ud.count+1;
set(obj,'UserData',ud);
end
以上给出了一个使用Timer画图的方法
关于Timer的函数
1.start();
2.stop();
3.timerfind();
eg.删除所有的timer
ts=timerfind;
if length(ts)>0
stop(ts);
delete(ts);
end
通过Name查找特定的Timer:
t=timerfind('Name','FebirdTimer');