考虑以下函数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_timer
。 tfcn
将立即被调用。
当尝试调试设置数据结构以供计时器稍后使用时,此行为很烦人。在调试另一个回调时,有没有办法阻止排队/执行定时器回调?
答案 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