使用MATLAB GUI的计时器是不是刷新GUI?

时间:2013-12-19 00:22:40

标签: matlab function loops user-interface timer

我的原始脚本中有计时器,工作正常,每60秒重新运行一次脚本。

我现在使用GUIDE将相同的脚本移动到GUI中,并且我将其真正粘贴到GUIDE提供的GUI代码中,并且它工作正常。但是,当我从原始脚本中包含计时器代码时,它不起作用,每当我运行它时都会显示此错误:

??? Error using ==> axes
Invalid object handle

Error in ==>
SoftwareMonitoringToolGUI>SoftwareMonitoringToolGUI_OpeningFcn at 100
axes(handles.axes5);

Error in ==> gui_mainfcn at 221
    feval(gui_State.gui_OpeningFcn, gui_hFigure, [],
    guidata(gui_hFigure), varargin{:});

Error in ==> SoftwareMonitoringToolGUI at 51
    gui_mainfcn(gui_State, varargin{:});

我的GUI看起来像这样,无论定时器代码是否包含在脚本中,它都保持不变,即MATLAB仍然构建它。不同之处在于,当我包含定时器代码时,MATLAB提供了上述错误:

enter image description here 当我只删除定时器代码时,它再次工作(但没有我需要使用定时器的刷新功能)。我的句柄是正确的,因为MATLAB在GUI窗口中生成我的数字。

定时器代码,放在GUI代码的开头:

function SoftwareMonitoringToolGUI_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;



guidata(hObject, handles);

%                  ***TIMER FUNCTION***
%**************************************************************************
% 
Period = 60; % Update period in seconds

tim = timer('Period', Period, 'ExecutionMode', 'fixedRate',...
    'TimerFcn', 'SoftwareMonitoringToolGUI');

start(tim)

stop(tim) 

我希望计时器每60秒刷新一次GUI。原因是每次执行脚本时都会计算新数据。想法?

2 个答案:

答案 0 :(得分:1)

当您将字符串传递给timer作为回调时,MATLAB将该字符串作为可执行代码调用。那么,你在这里做什么:

tim = timer('Period', Period, 'ExecutionMode', 'fixedRate',...
'TimerFcn', 'SoftwareMonitoringToolGUI');

相当于调用

exec('SoftwareMonitoringToolGui');

或者

SoftwareMonitoringToolGui;

没有参数。你还没有提供足够的代码来确切知道发生了什么,但我猜你{gui函数的名字SoftwareMonitoringToolGui。这意味着你的gui试图产生相同代码的不同实例,但没有传递参数。如果这不是它的工作方式,那么你就会遇到问题。

您可能想要做的是创建一个更新函数(与gui代码在同一文件中的附加函数),并将该函数的句柄传递给计时器:

tim = timer('Period', Period, 'ExecutionMode', 'fixedRate',...
'TimerFcn', @updateFcn);

答案 1 :(得分:0)

我认为,您需要将handles数组作为参数传递给您的函数,以便更新您的GUI控件。为此,请按以下方式创建计时器:

tim = timer('Period', Period, 'ExecutionMode', 'fixedRate',...
'TimerFcn', {@SoftwareMonitoringToolGUI, handles});

要使此类计时器正常工作,您需要更新SoftwareMonitoringToolGUI签名,如下所示:

function SoftwareMonitoringToolGUI(obj,event,handles)