0

我创建了一个名为 SCADA 的 GUI,并添加了一个名为 StatusData 的布尔变量,这是一个在启动 GUI 时设置为 false 的标志

handles.StatusData=false;
guidata(handles.output,handles);

我按下一个按钮,然后调用一个连续执行的函数(该函数具有无限循环)。一段时间后,我按下另一个按钮,将 StatusData 设置为 true。

handles.StatusData=true;
guidata(handles.output,handles);

现在,我需要StatusData从回调函数(我上面提到的同一个函数)访问,为了实现这一点,我在调用该函数时将句柄作为参数发送。现在,当按下更改状态数据的按钮时,实际句柄中的数据会发生变化,但我无法访问更新的状态数据,因为该函数已被调用。

如何在不将其作为参数发送的情况下访问 GUI 的更新句柄。

谢谢

4

1 回答 1

0

您可以只将hObject参数传递给您的函数,并在需要时使用guidata;检索您的值 IE,

function some_callback(hObject, handles, ...)
    myLoopingFunction(hObject, ...);

function myLoopingFunction(hObject, ...)
    for someVar = something
        % Update handles structure
        handles = guidata(hObject);
    end

或者,您可以创建一个句柄对象并将其放入句柄结构中;例如,

% In a separate file:
classdef uiState < handle
    % Probably should give this class a less general name...
    properties
        StatusData
    end
end

% In your UI file:
function some_callback(hObject, handles, ...)
    handles.state = uiState();
    handles.state.StatusData = false;
    % Now, when you modify handles.StatusData, the version used by
    % myLoopingFunction will also be updated, because they point to
    % the same object!
    myLoopingFunction(handles.state);

function myLoopingFunction(state, ...)
    for someVar = something
        % Now you just have to check state.StatusData
    end

对于简单的情况,我会使用第一种方法。对于更复杂的情况,必须跟踪几个参数并且它们以复杂的方式相互作用,我会使用第二种。如果您在某个变量中有大量数据并且希望阻止将其复制到对 UI 的每次调用中,则第二种方法也很有用。

就个人而言,对于复杂的 UI,我通常会创建一些应用程序类来跟踪用户界面(并为其提供命令行界面)并确保它始终可用于我的 UI,但这有点像使用在这个简单的案例中,用大锤打开果酱罐。

于 2013-04-14T09:34:24.290 回答