鉴于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\');