转载:http://blog.sina.com.cn/s/blog_48a0eb290100q9gc.html
MATLAB先天的多线程残疾,给编写实时程序带来了致命的打击。一般情况只能按堆栈的形式,排队执行Matlab命令,可是无巧不成书,有时我们偏偏需要进行多线程和实时编程。
比如:
1.我想实时更新一个电子表的时间,也就是每1s读取一次系统时间或者自动加1s
2.我需要这个程序在10s后终止
明显这些需要,使用一般的Matlab编程是没法或者说很难实现的。
还好Matlab自知在这方面亏欠大家太多,提供了唯一一个多线程的实现方法——Timer对象
一、Timer对象的创建
T = timer
T = timer('PropertyName1', PropertyValue1, 'PropertyName2', PropertyValue2,...)
括号中的参数可以在创建Timer是给出,也可以通过以后的set/get命令设置和读取
二、Timer属性参数
1.属性设置
(1)创建的时候直接赋值
%创建一个Timer对象变量TaskTimer,并给出部分参数
TaskTimer=timer(...
(2)使用set/get设置和读取
%创建一个默认的Timer对象
TaskTimer=timer
set(TaskTimer,'Name','Matlabsky','TimerFcn',@ExecutTask)
get(TaskTimer,'Name')
其实set/get的使用方法不只这个,还其他形式,特别是在同时设置多个句柄的多个属性时,特别方便,感兴趣的网友可以直接参考Matlab的帮助文档
(3)使用结构体设置
TaskTimer=timer
TaskTimer.Name='Matlabsky'
TaskTimer.TimerFcn=@ExecutTask
2.常用属性(下面是几个比较重要的,希望大家掌握)
(1)ExecutionMode
就是确定TimerFcn执行周期计算的始末点
'singleShot'
'fixedSpacing'
'fixedDelay'
'fixedRate'
(2)Period
也就是每个Period执行一次TimerFcn,执行周期到底指的是哪两个时刻之间的间隔由ExecutionMode决定
(3)StartDelay
从启动Timer开始到第一次把TimerFcn的加入到Matlab的执行语句队列中去的时延, 默认值为0s
(4)TasksToExecute
TimerFcn被执行的次数,默认为1次,设置多次时需要设置执行周期Period
(5)TimerFcn
是Timer对象的核心,Timer的多线就是通过执行这个TimerFcn来实现的,也是Timer对象的必选参数
当然还有其它属性,但是相对来说比较次要,更详细的说明,感兴趣网友可以自己查看MATLAB帮助文档
三、回调函数callback
1.callback的建立
Timer对象的回调函数有TimerFcn、ErrorFcn、StartFcn和StopFcn,其中TimerFcn是必选的
Timer的所有回调函数callback,至少有两个输入参数obj和event,其经典格式为
- function my_callback_fcn(obj,event,p1, p2)
- %by dynamic
- %see also http://www.matlabsky.com
- 092.15
- %
- %obj和event为必选输入参数
- %
- %obj就是前面创建的Timer对象,它包含着Timer的所有参数
- %
- %event是一个结构体,包含Type和Data两个字段,Type保存的是当前的Timer对象执行的时间,比如StartFcn、StopFcn等
- %
- %而Data还是一个结构体,包含time一个字段,保存的是执行该事件的系统时间
- %
- %所以event的使用是event.Type获取Timer到底在执行哪个事件,event.Data.time或者执行该时间的系统时间
- %
- %p1,p2...等是其它自定义的输入参数,根据需要在自己添加
2.回调函数的属性值
- 回调函数
属性值
- function myfcn(obj,event)
set(T,'StartFcn','myfcn')或者T.StartFcn='myfcn'(下同)
- function myfcn(obj,event)
set(T,'StartFcn',@myfcn)(同上)
- function myfcn(obj,event,p1,p2)
set(T,'StartFcn',{'myfcn',p1,p2})或者T.StartFcn={'myfcn',p1,p2}(下同)
- function myfcn(obj,event,p1,p2)
set(T,'StartFcn',{@myfcn,p1,p2})(同上)
3.回调函数实例
- function TimerFcn_callback(obj,event,var)
- txt=' event occurred at ';
- event_type = event.Type;%获取当前事件
- event_time = datestr(event.Data.time);
- msg = [event_type txt event_time];
- disp('Hello it's Matlabsky Timer Object Demo')
- disp('Now! Begin...')
- disp(msg)
- x=2*pi*[-1:0.01:1];
- y=var*sin(var*x)+var
- plot(x,y)
四、Timer对象应用实例
- function matlabsky_timer_demo
- %
- %by dynamic
- %see also http://www.matlabsky.com
- 09.1.23
- %
- clc
- %创建Timer对象
- T = timer('TimerFcn',@TimerFcn, 'StartDelay',10,'StartFcn',@StartFcn);
- %启动Timer
- start(T);
- %开始循环
- while T.userdata=='f'
-
disp('Love Matlab Love Matlabsky——Timer Object Demo');
-
pause(1)
- end
- %终止Timer
- stop(T);
-
- function TimerFcn(obj, event)
- s后终止程序
- obj.userdata='t';
- disp(['the BeiJing time is ' datestr(event.Data.time)])
- disp('10s Has Escaped, Following The Orde of TimerFcn, Now I Have To Stop This Progam!')
- function StartFcn(obj,event)
- obj.userdata='f';
- disp(['the BeiJing time is ' datestr(event.Data.time)])
- disp('The Timer Object Demo Begin Now!')
程序运行结果为
- the BeiJing time is 17-Feb-2009 13:36:05
- The Timer Object Demo Begin Now!
- Love Matlab Love Matlabsky——Timer Object Demo
- Love Matlab Love Matlabsky——Timer Object Demo
- Love Matlab Love Matlabsky——Timer Object Demo
- Love Matlab Love Matlabsky——Timer Object Demo
- Love Matlab Love Matlabsky——Timer Object Demo
- Love Matlab Love Matlabsky——Timer Object Demo
- Love Matlab Love Matlabsky——Timer Object Demo
- Love Matlab Love Matlabsky——Timer Object Demo
- Love Matlab Love Matlabsky——Timer Object Demo
- Love Matlab Love Matlabsky——Timer Object Demo
- the BeiJing time is 17-Feb-2009 13:36:15
- 10s Has Escaped, Following The Orde of TimerFcn, Now I Have To Stop This Progam!
这里还一个Timer对象在【股票浏览器】GUI中的应用的实例,感兴趣的可以看看http://www.matlabsky.com/thread-656-1-1.html
五、与Timer相关的其它函数
timer
set/get
start
startat
stop
disp
timerfind
timerfindall
wait
delete