调试计时器启动回调

时间:2018-05-08 11:16:58

标签: matlab timer

考虑以下函数test_timer

function test_timer
TestTimer = timer('Period', 1, 'TasksToExecute', Inf);

TestTimer.TimerFcn = @tfcn;
TestTimer.StartFcn = @sfcn;

start(TestTimer);

function sfcn(hObject, eventdata)
    disp('init');
    pause(1)
    disp('init done');


function tfcn(hObject, eventdata)
    disp('tfcn');
    stop(hObject);

首先,按原样运行test_timer。按预期顺序调用函数,即首先是sfcn,然后是tfcn。现在在sfcn中放置一个断点,例如在第10行并运行test_timertfcn将立即被调用。

当尝试调试设置数据结构以供计时器稍后使用时,此行为很烦人。在调试另一个回调时,有没有办法阻止排队/执行定时器回调?

1 个答案:

答案 0 :(得分:0)

MATLAB证实这是一个错误。他们通过将计时器包装在一个对象中来建议一种解决方法:

TimerWrapper.m

classdef TimerWrapper
properties
TimerObj
StartFcn = {};
end

methods

function obj = TimerWrapper(varargin)
obj.TimerObj = timer(varargin{:});
obj.StartFcn = obj.TimerObj.StartFcn;
obj.TimerObj.StartFcn = @(~,~){};
end

function start(obj)
if ~isempty(obj.StartFcn)
obj.StartFcn(obj.TimerObj,'start');
end
start(obj.TimerObj);
end

function stop(obj)
stop(obj.TimerObj);
end

end
end

test_timer_new.m

function test_timer_new
t = timer('Period', 1, 'TasksToExecute', Inf);

t.TimerFcn = @tfcn;
t.StartFcn = @sfcn;

TestTimer = TimerWrapper(t);

start(TestTimer)

function sfcn(hObject, eventdata)
    disp('init');
    pause(1)
    disp('init done');


function tfcn(hObject, eventdata)
    disp('tfcn');
    [actst] = rand > .6;
    if actst

        stop(hObject);
    end