使用方法

具体参考官方文档:

四种定时模式:

  • sigleShot:只执行一次,故Period属性不起作用,其他模式都可以执行多次

  • fixedDelay:上一次TimerFcn执行完毕时刻到下一次TimerFcn被加入队列时刻之间的间隔

  • fixedRate:上一次开始执行到下一次被加入队列之间的间隔

  • fixedSpacing:前后两次被加入到执行语句队列时刻之间的间隔

法1:

timer_id = timer;:
timer_id.StartDelay = 1.0;
timer_id.Period = 1.0;
timer_id.ExecutionMode = 'fixedSpacing';
timer_id.TimerFcn = @timer_handler;
start(timer_id);

function timer_handler(~,~)
	% user code
end

注意:MATLAB是解释性语言,如果定时器运行中继续启动仿真,会导致同样功能的新定时器启动,且ID号不同属于不同线程!所以重新仿真前应该停止所有定时器并删除!

法2:

t = timer('StartDelay',1,'TimerFcn',@t_TimerFcn,'Period',2,'ExecutionMode','fixedRate');
start(t)

function t_TimerFcn(hObject,eventdata)
	% user code
end

应用实例

案例1:

% 代码来源:https://zhuanlan.zhihu.com/p/136570344

% 启动定时器
clear all;
clc;
% 删除现有的定时器,重新创建一个定时器
%stop(timerfind);
%delete(timerfind);   
timer_id = timer;
timer_id.StartDelay = 1.0;
timer_id.Period = 1.0;
% 周期性执行,fixedSpacing模式
timer_id.ExecutionMode = 'fixedSpacing';
timer_id.TimerFcn = @timer_handler;
%启动定时器
start(timer_id);

function timer_handler(~,~)
    persistent counter;
    if isempty(counter)
     counter = 0;
    end
    fprintf(1,'定时器回调=%d\n',counter);
    counter = counter+1;
end

案例2:

% 代码来源:https://blog.csdn.net/superjunenaruto/article/details/54614569

%%  定时器
% 函数说明:(命令行输入)
% t_test:创建一个定时器对象,从 0 开始计数(每 2 秒)
% t_test('stop'):停止计数,删除定时器
function t_test(varargin)
    global num num1 num2
    if nargin == 0  % 直接命令行输入 t_test 表示:创建一个定时器对象,开始定时
        num = 0;
        num1 = 100;
        num2 = 1000;
        delete(timerfind)   % 删除现有的定时器,重新创建一个定时器
        t = timer('StartDelay',1,'TimerFcn',@t_TimerFcn,'Period',2,'ExecutionMode','fixedRate');
        t1 = timer('StartDelay',1,'TimerFcn',@t_TimerFcn1,'Period',2,'ExecutionMode','fixedDelay');
        t2 = timer('StartDelay',1,'TimerFcn',@t_TimerFcn2,'Period',2,'ExecutionMode','fixedSpacing');
        start([t,t1,t2])
    elseif ((nargin == 1) && strcmp(varargin{1},'stop'))
        stop(timerfind)
        delete(timerfind)
    else
        
    end
end
%%  回调函数
function t_TimerFcn(hObject,eventdata)
    global num
    disp(num2str(num))
    num = num + 1;
end
function t_TimerFcn1(~,~)
    global num1
    disp(num2str(num1))
    num1 = num1 + 1;
end
function t_TimerFcn2(~,~)
    global num2
    disp(num2str(num2))
    num2 = num2 + 1;
end