有没有办法从MATLAB中的计时器对象中提取每个句点开头的经过时间? 假设我们有一个这样的计时器对象:
t=timer('ExecutionMode', 'fixedRate', ...
'Period', 15, ...
'TimerFcn',@(x,y)disp('Hello World!'))
答案 0 :(得分:2)
y
包含绝对时间戳。在陈述计时器时存储它并取得差异:
function my_callback(m,x,y)
persistent starttime
switch m
case 'start'
starttime=y.Data.time;
case 'timer'
disp(datenum(y.Data.time-starttime)*24*60*60);
otherwise
error('unknown argument');
end
end
使用计时器:
t=timer('ExecutionMode', 'fixedRate','Period', 15,'StartFcn',@(x,y)my_callback('start',x,y),'TimerFcn',@(x,y)my_callback('timer',x,y))
start(t)
使用userdata的替代解决方案:
t=timer('ExecutionMode', 'fixedRate','Period', 15,'StartFcn',@(x,y)set(x,'UserData',y.Data.time),'TimerFcn',@(x,y)disp(datenum(y.Data.time-get(x,'UserData'))*24*60*60))
答案 1 :(得分:0)
使用tic
,toc
和'UserData'
timer
- 对象上没有直接的方法来读取自上次调用以来经过的时间。可以使用tic
和toc
的构造来实现您想要的效果。
通用字段'UserData'
可用于将用户数据添加到计时器对象。我们可以使用set()
写下此值,并使用get()
进行阅读。因此,我们在回调函数中使用tic
设置此值,稍后将其返回以使用toc
计算时差。
更具体地说,这是回调函数:
function timerCallback(timerObj,event) %#ok<INUSD>
disp('Hello World!');
set(timerObj,'UserData',tic);
现在我们可以编写一个包装函数来获取经过的时间:
function retval = getElapsedTime(timerObj)
retval = toc(get(timerObj,'UserData'));
建议方法的示例用法
要查看此方法是否有效,我们使用pause
等待for循环并大约每秒读取经过的时间。这是一个完整的例子:
function timer_example
t = timer('ExecutionMode', 'fixedRate', ...
'Period', 5, ...
'TimerFcn', @timerCallback); % create timer
start(t); % start timer
pause on; % make sure pause can be used
for i = 1:10
pause(1); % wait a second
disp(getElapsedTime(t)); % display the elapsed time
end
stop(t); % stop timer
delete(t); % delete timer
function timerCallback(timerObj,event) %#ok<INUSD>
disp('Hello World!');
set(timerObj,'UserData',tic);
function retval = getElapsedTime(timerObj)
retval = toc(get(timerObj,'UserData'));
这给出了以下输出:
>> timer_example
Hello World!
1.0163
2.0173
3.0235
4.0285
Hello World!
0.0366
1.0390
2.0427
3.0461
4.0470
Hello World!
0.0515
答案 2 :(得分:0)
使用tic作为计时器的StartFcn,然后使用toc引出已用时间,所以:
timerObj = timer; %create timer object
timerObj.ExecutionMode = 'fixedSpacing';
timerObj.Period = 15;
timerObj.StartFcn = @(~,~)tic; % start ticking when timer starts
timerObj.TimerFcn = @myTimerFunc;
myTimerFunc是:
function [] = myTimerFunc(timerObj,event)
% use toc
disp(toc);
end