【问题标题】:MATLAB exiting loop in function when using GUIMATLAB在使用GUI时退出函数循环
【发布时间】:2011-07-23 21:02:05
【问题描述】:

我有一个函数,当单击按钮时运行,该函数将调用另一个函数来执行绘图,这是一个由一系列循环组成的动画。问题是,程序运行后无法停止,除非按 Ctrl+C 导致整个 .exe 失败并需要重新打开它。

我想制作一个重置按钮,以停止循环运行,但是如何将新变量从中断传递到堆栈上方两级的现有函数?

谢谢

编辑@ 22:13 27/3/2011(英国时间)

更清楚我想要做什么:

function push_calculate_Callback(hObject, eventdata, handles)
    (List of parameters read in the GUI)
    fmain(list of paramters required to pass to the function, fmain)

这是直接链接到 GUI 的代码的第一部分,fmain 看起来像:

function fmain(List of parameters)
(List of calculations...)
fplotting(list of paramters for plotting)

fplotting是动画从哪里出来的,在fplotting里面:

function fplotting(list of parameters)
for i = 1:(end)
    (do the animation plot)
end

这是我按下重置按钮时想要停止的循环。因为如果有人在动画进行(循环)时按 Ctrl+C,它会给出错误并且 exe 文件将崩溃并需要重新打开它。所以我希望它能够在有人按下重置按钮时停止它。

如果我使用持久性,新值,在我按下重置按钮后,它不会传递到现有循环并打破循环......看起来我正在寻找一种在我改变后更新参数的方法它在函数之外

谢谢

【问题讨论】:

    标签: user-interface matlab loops stack exit


    【解决方案1】:

    使用exit或quit退出程序

    要停止循环运行,您可以使用 break 或 return from a function..

    【讨论】:

    • 我想这不是解决任何与 GUI 相关的问题的方法......如果你把 return 放入你的回调中,它只会返回你没有任何东西;如果你放了“break”,那么从技术上讲你不能放 break 因为你在回调函数中没有 for / while 循环
    【解决方案2】:

    您最好的选择可能是使用PERSISTENT 变量,您在函数 2 中循环的每次迭代中检查其状态,并在“重置”回调中修改其值。

    重置回调

    function reset_callback(hObj,eventdata,handles)
       %# "activate" persistent variable
       persistent breakThis
       %# set it to 1
       breakThis = true;
    

    循环函数

    function functionWithTheLoop(someInput)
       ...
       %# "activate persistent variable
       persistent breakThis
       ...
       %# start loop
       for iter = 1:numOfIterations
          %# check whether you need to break out of the loop
          if breakThis
             %# reset the function value
             breakThis = false;
             break;
          end    
          ...   
       end
    

    【讨论】:

    • 我刚刚编辑了问题以使其更清楚,希望它有助于识别我的问题,谢谢!!
    【解决方案3】:

    您可以使用应用程序数据信息,即setappdatagetappdata

    % animation loop function
    function loop(hFig)
       setappdata(hFig, 'run', true);   % here or somewhere else...
       while(getappdata(hFig, 'run'))
          plot(....);
       end
    end
    
    % GUI stop-loop btn callback
    function stop(hFig)
       setappdata(hFig, 'run', false);
    end
    

    我想这会奏效。

    【讨论】:

    • @Thomas:请使用 add comment 链接离开 cmets。
    猜你喜欢
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    相关资源
    最近更新 更多