您的位置:首页 > 编程语言 > MATLAB

Matlab——Timer对象(多线程编程)

2017-02-07 17:46 375 查看
原文地址:http://www.ilovematlab.cn/thread-258845-1-1.html

今天突然想实现个多线程功能,尼玛,被折磨透了。最终才找到了Timer对象和 Dynamic关于Timer的教程。感谢dynamic 大神的无私奉献。但由于原文应用实例写的比较特殊,因此单独写出一部分总结和一个实例做为自己的贡献吧。

看了上述资料相信大家对Timer对象的各个属性和其字段有一定了解,更多的信息可在帮助文件中获得。
这里再总结一下,仔细看Timer对象的句柄我们可以发现,Timer其实由两部分构成:
(一)对象本身的一些属性,如ExecutionMode等
(二)回调函数(Call Back Function)

对于第一点,Timer对象实质上与结构体一样,只需要掌握每个属性及其字段名即可。
可见Timer实现相关功能主要集中在回调函数上。那么与普通函数相比,回调函数有哪些不同呢?

1.有默认的入参obj和event。这一点一定要注意,在编写回调参数时一定要在函数名末尾加(obj,event),否则出错。
2.当有其他入参时,函数调用形式发生变化,需写在同一元胞数组中。
这两点详见Dynamic帖子第三部分,这里仅仅予以强调。

接下来我将试图以一个例子,用最最直白的语言告诉大家,尼玛,这玩意到底怎么用。

这是一个画圆的脚本:
alpha=0:pi/20:2*pi;%角度[0,2*pi]
R=2;%半径
x=R*cos(alpha);
y=R*sin(alpha);
plot(x,y,'o-') %画图
axis equal %平衡坐标轴

那么如果我想做一个动画,让这个圆每隔一段时间画一点点,应该怎么画呢?
这无疑要用到多线程控制。及我们介绍的Timer 对象。

首先将上述脚本改编成回调函数TimeFcn:(本例中取名为CircleTask)

function CircleTask(obj,event)
event_time = datestr(event.Data.time);   %使用event对象的data的time属性获得系统当前时间,并转换成字符串
d=event_time(19:20);   %由于本身保存的是年月日小时分钟秒,但我只需要秒的数据,因此单独取出
d=str2double(d); %将字符串转换成数字
alpha=0:pi/20:pi/20*d;%角度[0,2*pi]
ud=obj.UserData;  %使用obj对象的UserData属性传参
R=ud;%半径
x=R*cos(alpha);
y=R*sin(alpha);
plot(x,y,'o-')
axis equal

以上就是整个回调函数,将其保存并添加路径。

Timer对象的调用脚本为:

t=timer('Name','CircleTimer',...
'TimerFcn',@CircleTask,...
'Period',1,...
'ExecutionMode','fixedspacing');
%本句解释成中文就是:
%t= timer(计时器名字是啥?,叫CircleTimer,要输入的TimerFcn回调函数是啥? ,
%用CircleTask这个函数,每次隔多久运行?,一秒,
%执行时间间隔的模式是什么?,上次执行完毕到这次执行计时);
ud=3;
t.UserData=ud;
start(t);

以上代码全部复制黏贴进command window按回车即可

结束时运行: 
stop(t);

在这里我想说明我回调函数前四步为何那么麻烦:
由于matlab本身保存的double型时间包含年月日小时分钟秒这些信息,而我需要的仅仅是“秒”这一信息,因此不得不先将matlab的double型时间转换成文字,读取秒后再转换成数值。如果大家有更好的方法请务必要告诉我
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: