我正在尝试创建一个由主GUI组成的程序,该GUI可以调用多个单独的GUI来显示“实时”连续更新的不同数据。但是,似乎只能在同一时间更新单个GUI中的图。可以同时更新同一GUI中的多个轴。但是,如果打开了两个GUI,则一次只能更新单个GUI中的轴,其他GUI中的轴“保持”,直到另一个GUI停止尝试连续绘图。
作为对这个问题的一个简单测试,我创建了一个由单轴标记为'plotAxes'和一个togglebutton组成的GUI。当togglebutton被“压下”时,使用代码在轴上连续绘制随机数据:
xData = linspace(1,20,20);
while(get(hObject,'Value'))
yData = rand(20,1);
plot(handles.plotAxes,xData,yData);
drawnow;
end
将'gui_Singleton'参数设置为0,我打开了这个GUI的两个实例。如果我切换GUI A开始绘图,则在轴上显示连续的随机数据。如果我然后将GUI B切换到绘图,则GUI A中的显示保持在最后一帧,并且GUI B开始显示连续的随机数据。当我取消切换GUI B绘图按钮时,GUI A将恢复连续绘图。
有没有办法让单独的GUI窗口中的轴同时更新?我尝试使用'batch'命令在不同的工作程序上运行GUI,但是在通过'batch'启动时不显示GUI(我怀疑'批处理'不适用于任何与图形相关的内容)。
答案 0 :(得分:2)
从计时器对象运行绘图函数。这将使您保持两个轴的逻辑分离:每个轴一个计时器。请参阅help timer
,并将TimerFcn属性设置为计时器到期时要运行的函数。
for ii=1:2
figure; ax(ii) = gca;
tim(ii) = timer;
tim(ii).ExecutionMode = 'fixedRate';
tim(ii).Period = 0.5;
% A timer callback function needs at least two parameters.
% x,y are dummy parameters to make the function call happy,
% but we will ignore the values
tim(ii).TimerFcn = @(x,y)(plot(ax(ii), rand(10,3)));
start(tim(ii));
end
编辑: 我忘了提到计时器对象可以存储在GUI数据结构中,而切换按钮回调只需要启动和停止计时器。
答案 1 :(得分:1)
您需要从单个线程控制轴:
figure;ax(1) = gca;
figure;ax(2) = gca;
while all(ishandle(ax))
plot(ax(1),rand(10,3));
plot(ax(2),rand(10,3));
drawnow
end
这将在两个轴上绘制,直到您关闭其中一个数字。