【问题标题】:Timer with MATLAB GUI is not refreshing GUI?带有 MATLAB GUI 的计时器不刷新 GUI?
【发布时间】:2014-01-07 09:46:06
【问题描述】:

我的原始脚本中有计时器,它运行良好,它每 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 提供了上述错误:

当我只删除计时器代码时,它会再次工作(但没有我需要使用计时器的刷新功能)。我的句柄是正确的,因为 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。原因是每次执行我的脚本时都会计算新数据。想法?

【问题讨论】:

  • 问题似乎在计时器调用的函数范围内。脚本与 GUI(功能)在这方面可能有所不同。您必须提供更多详细信息 - 实际上,您可以完整发布一个较小的测试用例是最好的。你可能会通过创建这样一个测试用例找出答案,想想它。
  • 如果我在这里将计时器定义设计为一个函数并将其包含在脚本的最顶部会怎样。即function timer = code I inserted above 我该怎么做?我想我明白你的意思。我将修改我的帖子,并尝试提供更多关于代码中发生的事情的详细信息,也许还有一些图像。
  • 附加线程以包含 GUI 图像以确保完整性。让我知道您可能需要的其他详细信息。

标签: matlab function loops user-interface timer


【解决方案1】:

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

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

相当于调用

exec('SoftwareMonitoringToolGui');

或者

SoftwareMonitoringToolGui;

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

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

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

【讨论】:

  • 您能否提供一个示例来说明您的意思或什至操纵我的代码?除了应该运行的值(静态设置为 60)之外,计时器不需要任何输入。基本上,计时器的唯一目的是无限期地每 60 秒再次执行我的脚本中的所有内容。即 GUI 窗口将每 60 秒重新打开/更新一次。原因是我的永恒脚本代码正在处理实时数据,因此脚本会获取并计算新的外部数据,而计时器只是告诉脚本每 60 秒再执行一次。
  • 在计时器发生之前在您的 gui 代码中设置断点。尝试在调试器命令行上调用函数SoftwareMonitoringToolGui。看看会发生什么。
  • 我是否可以不只是将我拥有的计时器代码转换为函数定义,并将其放在整个脚本的开头,然后放在包含其余用户定义代码的其他函数之前?我不确定断点,因为我对 MATLAB/编码还很陌生。
  • 我建议谷歌搜索debugging matlab。至于设置断点,请单击编辑器中要让调试器停止的行上的行号旁边。应该出现一个鲑鱼色的点。当它停在那里时,您将能够在命令行上测试内容并查看该范围内存在的所有变量的状态。
【解决方案2】:

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

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

要使此类计时器正常工作,您需要像这样更新SoftwareMonitoringToolGUI 签名:

function SoftwareMonitoringToolGUI(obj,event,handles)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2012-03-09
    • 2012-01-17
    • 2012-12-26
    • 1970-01-01
    • 2018-09-18
    • 2014-08-28
    相关资源
    最近更新 更多