如何使功能无阻塞? Matlab GUI中的动态绘图

时间:2016-03-04 18:51:50

标签: matlab user-interface matlab-guide matlab-gui

自从使用Matlab以来已经有一段时间了,直到现在我还没有将它用于任何GUI创建。我的目标是有一个我可以按下的按钮,然后在计算结果时绘制结果。该按钮应根据发生的情况在“开始”和“停止”之间切换。这些结果被收集了几次迭代,每次迭代都会给出另一个数据点。

我的解决方案是将轴传递给执行计算的函数,然后可以绘制到轴上。这是有效的,但是在发生这种情况时,按钮在绘图完成之前不会切换到“停止”。我可以使功能无阻塞吗?我甚至可以采用最好的方法吗?如何使用“停止”按钮停止计算?我只需要为此创建一个线程(matlab支持线程)吗?

我一直在用一个简单的函数测试我的想法来画一个正弦

function [ t,y ] = slowSin(ax)
%Plot a sin curve slowly
t = [0:0.06:4*pi];
y = sin(1.5*t);

for i = 1:length(t)
    plot(ax, t(1:i), y(1:i))
    pause(0.1)

end

直到现在我才想到线程。我将很快调查,但所有的帮助都表示赞赏。

1 个答案:

答案 0 :(得分:1)

首先,MATLAB不会对任何图形进行多线程处理,因此您必须具有创造性。

此外,如果您尝试在计算过程中进行一些绘图,则需要使用drawnow来刷新回调和渲染事件。

至于知道何时停止,你可以将按钮的图形句柄传递给你的计算,它可以检查每次迭代的值吗?

我有一个使用persistent variable来跟踪当前迭代的示例,并允许用户通过取消切换按钮来“暂停”计算。

function guiThing()

    figure();
    hbutton = uicontrol('style', 'toggle', 'String', 'Start');

    hplot = plot(NaN, NaN);

    nIterations = 1000;
    set(gca, 'xlim', [1 nIterations], 'ylim', [1 nIterations])

    set(hbutton, 'callback', @(s,e)buttonCallback())

    function buttonCallback()
        % If the button is depressed, calculate the thing
        if get(hbutton, 'value')
            calculateThing(hbutton, hplot, nIterations);
        end
    end
end

% This function can live anywhere on the path!
function calculateThing(hbutton, hplot, nIterations)

    % Keep track of data with persistent variables
    persistent iteration

    % First time to call this function, start at 1
    if isempty(iteration); iteration = 1; end

    for k = iteration:nIterations
        iteration = k;

        % If the button is not depressed then stop this
        if ~get(hbutton, 'value')
            return
        end

        % Update plotting in some way
        curdata = get(hplot);
        set(hplot, 'XData', [curdata.XData k], ...
                   'YData', [curdata.YData, k])

        % Flush drawing queue
        drawnow

        fprintf('Iteration: %d\n', iteration);
    end
end

您可以使用持久变量来跟踪需要在迭代(以及停止和启动)之间保留的任何其他数据。