自从使用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
直到现在我才想到线程。我将很快调查,但所有的帮助都表示赞赏。
答案 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
您可以使用持久变量来跟踪需要在迭代(以及停止和启动)之间保留的任何其他数据。