【问题标题】:How do I run two GUIs in MatLab in parallel?如何在 MatLab 中并行运行两个 GUI?
【发布时间】:2010-10-10 00:56:44
【问题描述】:

我正在使用 MatLab,我有两个 GUI。当我单击一个 GUI 中的按钮时,将调用第二个 GUI,并且两个 GUI 都可以并行工作。如果有人知道这个问题的答案,请回复我。

我有两个 GUI 表单。在第一个中,我将一条线旋转一圈(通过使用极坐标函数。这是为了我的雷达模拟目的)。在那个 GUI 中,我只有一个按钮。当我按下它时(通过使用for循环和暂停功能。实际上它是一个模拟,有点像在圆圈中旋转)

圆圈旋转,直到我在同一个 GUI 中按下另一个按钮。我还有一个按钮。如果我按下它,它会激活另一个 GUI 进行相同的旋转,但不是整个圆圈,圆圈的某些部分(扇区)。所以在这里我需要圆形和扇区旋转中的线条。但实际上,当我从圆形 GUI 的按钮调用扇区 GUI(第 2 个 GUI)时会发生什么情况,即线在圆形停止中旋转,并且在扇区旋转完成后控制权交给扇区。圆圈出现在扇区 GUI 中。

如果有人知道如何并行执行这两个 GUI,请回答我。如果这仍然太模糊,请告诉我,我会解释更多。

我的代码如下:

function twoguis
%Initializations: 
 hFigure2 = []; 
 hAxes2 = [];  
 %Make figure 1:
 hFigure1 = figure('Position',[50 200 300 300]);
 hAxes1 = axes('Parent',hFigure1,'Position',[0.1 0.2 0.8 0.7]); 
 hButton = uicontrol('Style','pushbutton',...              
                     'Position',[10 10 100 20],...       
                     'String','New Window',...  
                     'Callback',@button);
 % Start a loop that continuously changes the color of
 %   the axes at 1 second intervals: 
 while true,  % You will have to press Ctrl-c to stop!  
   newColor = rand(1,3); 
   set(hAxes1,'Color',newColor);
  if ishandle(hAxes2),
     set(hAxes2,'Color',newColor);
  end
    drawnow;
    pause(1); 
  end
 function button(source,event)  
   % Check if Figure 2 has already been made: 
  if ishandle(hFigure2), 
    return;    
  end
   % If it isn't made, make Figure 2:
   hFigure2 = figure('Position',[350 200 300 300]);
    hAxes2 = axes('Parent',hFigure2,'Position',[0.1 0.2 0.8 0.7]);  
    for xc=0:.05:6.28;
    polar([0,xc],[0,10]);
    pause(.1);
    end
   end 
 end

谁能建议我如何在两个图中连续更改颜色并在极坐标函数中连续旋转线?

【问题讨论】:

  • 让您的问题更明确。不清楚你在问什么。
  • 目前还不清楚你在问什么。也许您可以编辑您的问题并添加到目前为止的代码,以便我们可以准确地看到您在做什么。我最好的猜测是,您有两个带有圆形刻度盘的 GUI,您想同时更新......对吗?
  • 是的,如果你能做到,请给出答案

标签: user-interface matlab


【解决方案1】:

我制作了一个视频,介绍如何让两个或多个 GUI 共享数据并协同工作。简短的回答是使用 SETAPPDATA 和 GETAPPDATA 在 GUI 之间共享数据。长答案在这里:

http://blogs.mathworks.com/videos/2005/10/03/guide-video-part-two/

我的 GUI 视频集可以在这里找到:

http://blogs.mathworks.com/videos/category/gui-or-guide/

-道格

【讨论】:

  • 糟糕!我忽略了在我的回答中链接到你的博客。我知道有一些 MathWorks 人员给出了这样的例子。 =)
  • 亲爱的道格,我的问题与并行计算工具箱无关,我再次更清楚地解释了这个问题,我有 1 个 gui,我在该极轴中心绘制极坐标到边缘绘制一条旋转的线那个圈子
  • 当我通过 push putton 从这个 gui 调用第二个 gui 时,另一个 gui 与第一秒并行运行,如果你知道,请帮助我,两者都可以并行工作
  • Tatiparthi,我从来没有提到并行计算工具箱。 -道格
【解决方案2】:

编辑:我知道您想知道如何在 GUIDE 中执行此操作的答案,但也许您会发现这个非 GUIDE、嵌套函数的答案很有帮助...

以下代码创建一个带有极坐标图和 2 个按钮的雷达 GUI 窗口。 “开始”按钮将开始逆时针旋转线条,然后该按钮将变成“停止”按钮(如果再次按下它将停止旋转线条)。第二个按钮启动扇区 GUI。该图有一个极坐标图,其线将旋转穿过极坐标图的一部分,在雷达 GUI 线当前位置两侧的 45 度范围内。扇区 GUI 中还有另一个“开始”/“停止”按钮来控制动画。当扇区 GUI 打开时,雷达 GUI 不会动画。一旦扇区 GUI 关闭,雷达 GUI 可以再次旋转。您一次只能打开 1 个扇区 GUI。

function radar_gui

  % Initializations:

  radarAngle = 0;      % Current angle of radar GUI
  sectorAngle = 0;     % Current Angle of sector GUI
  radarStep = pi/90;   % Angle increment (radians) per 0.1 s
  sectorWidth = pi/2;  % Angle (radians) swept by sector GUI
  hSectorFigure = [];
  hSectorAxes = [];
  hSectorLine = [];
  hButton2 = [];

  % Make radar figure:

  hRadarFigure = figure('Position',[50 200 300 300],...
                        'DeleteFcn',@delete_timer);
  hRadarAxes = axes('Parent',hRadarFigure,...
                    'Position',[0.1 0.2 0.8 0.7]);
  hRadarLine = polar(hRadarAxes,[0 radarAngle],[0 1]);
  hButton1 = uicontrol('Style','pushbutton',...
                       'Parent',hRadarFigure,...
                       'Position',[10 10 60 20],...
                       'String','Start',...
                       'Callback',@toggle_radar);
  uicontrol('Style','pushbutton','Parent',hRadarFigure,...
            'Position',[190 10 100 20],...
            'String','Show Sector',...
            'Callback',@open_sector);

  % Create a timer that spins the radar lines:

  spinTimer = timer('TimerFcn',@radar_timer,...
                    'ExecutionMode','fixedRate',...
                    'Period',0.1,...
                    'TasksToExecute',inf);

%~~~Begin nested functions~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  function open_sector(source,event)
    if ishandle(hSectorFigure),
      return;
    end
    sectorAngle = radarAngle;
    hSectorFigure = figure('Position',[350 200 300 300]);
    hSectorAxes = axes('Parent',hSectorFigure,...
                       'Position',[0.1 0.2 0.8 0.7]);
    hButton2 = uicontrol('Style','pushbutton',...
                         'Parent',hSectorFigure,...
                         'Position',[10 10 60 20],...
                         'String',get(hButton1,'String'),...
                         'Callback',@toggle_radar);
    hSectorLine = polar(hSectorAxes,[0 sectorAngle],[0 1]);
    drawnow;
  end

  function toggle_radar(source,event)
    if strcmp(get(source,'String'),'Start'),
      set(hButton1,'String','Stop');
      if ishandle(hButton2),
        set(hButton2,'String','Stop');
      end
      start(spinTimer);
    else
      set(hButton1,'String','Start');
      if ishandle(hButton2),
        set(hButton2,'String','Start');
      end
      stop(spinTimer);
    end
    drawnow;
  end

  function radar_timer(source,event)
    if ishandle(hSectorLine),
      sectorAngle = sectorAngle+radarStep;
      if (sectorAngle >= radarAngle+sectorWidth/2),
        sectorAngle = radarAngle-sectorWidth/2;
      end
      set(hSectorLine,'XData',[0 cos(sectorAngle)],...
                      'YData',[0 sin(sectorAngle)]);
    else
      radarAngle = radarAngle+radarStep;
      if (radarAngle >= 2*pi),
        radarAngle = radarAngle-2*pi;
      end
      set(hRadarLine,'XData',[0 cos(radarAngle)],...
                     'YData',[0 sin(radarAngle)]);
    end
    drawnow;
  end

  function delete_timer(source,event)
    stop(spinTimer);
    delete(spinTimer);
    if ishandle(hSectorFigure),
      delete(hSectorFigure);
    end
  end

%~~~End nested functions~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

end

如果要调整扇区 GUI 的旋转速度或扫描角度,可以在函数开头调整“radarStep”和“sectorWidth”变量的值。希望这会有所帮助!

【讨论】:

  • 亲爱的新手,我的问题与并行计算工具箱无关,我再次更清楚地解释了这个问题,我有 1 个 gui,我在该极轴中心绘制极坐标到边缘绘制一条旋转的线那个圈子
  • 当我通过 push putton 从这个 gui 调用第二个 gui 时,另一个 gui 与第一秒并行运行,如果你知道请帮助我,两者都可以并行工作
  • 亲爱的新手,问题几乎和你解释的一样,你能用指南给出相同的代码吗,我认为它是通过编程方式,将在 thorug 指南中给出代码,因为它让我感到困惑,但是上面代码的输出正在运行,但我需要通过指南 guithankyou mr.gnovice
  • 不幸的是,我从不使用 GUIDE。如果您在使用 GUIDE 时需要帮助,我建议您观看 Doug 的视频。另外,我不确定您希望您的 GUI 如何更新...您希望它们在第一个图打开时连续更新,还是您希望它在第二个图打开时开始?
  • thanq,只需在 hAxes2 = axes('Parent',hFigure2,'Position',[0.1 0.2 0.8 0.7]) 之后添加你给我的代码即可;在按钮功能中,代码为 x=0:.05:6.28;极地([0,x],[0,10]);暂停(.1);最后,如果你这样做,你会很容易理解我的问题,我想要的是我想要的是第一个 gui 中的颜色
【解决方案3】:

问题在于 MATLAB M 代码解释器基本上是单线程的。因此,当函数“按钮”被调用时,它会控制解释器并且在完成扫描之前不会将其返回。我建议研究使用 MATLAB 计时器类。这给人一种多线程的“感觉”,尽管从技术上讲,当调用计时器回调时,它也会阻止其他 M 代码运行。这是您的原始代码的修改形式,显示了我在说什么:

function twoguis
%Initializations: 
    hFigure2 = []; 
    hAxes2 = [];  
    %Make figure 1:
    hFigure1 = figure('Position',[50 200 300 300]);
    hAxes1 = axes('Parent',hFigure1,'Position',[0.1 0.2 0.8 0.7]); 
    hButton = uicontrol('Style','pushbutton',...              
                        'Position',[10 10 100 20],...       
                        'String','New Window',...  
                        'Callback',@button);
    % Start a loop that continuously changes the color of
    %   the axes at 1 second intervals: 
    while true,  % You will have to press Ctrl-c to stop!  
        newColor = rand(1,3); 
        set(hAxes1,'Color',newColor);
        if ishandle(hAxes2),
            set(hAxes2,'Color',newColor);
        end
        drawnow;
        pause(1); 
    end

    function button(source,event)  
    % Check if Figure 2 has already been made: 
        if ishandle(hFigure2), 
            return;    
        end
        % If it isn't made, make Figure 2:
        hFigure2 = figure('Position',[350 200 300 300]);
        hAxes2 = axes('Parent',hFigure2,'Position',[0.1 0.2 0.8 0.7]);  
        tmr = timer('TimerFcn',@spin, 'executionmode','fixedrate','period',.1);
        start(tmr)

        function spin(obj, event)
            polar(hAxes2,[0,get(obj, 'TasksExecuted')*0.05],[0,10]);
        end
    end 
end

【讨论】:

  • Thanq french 你能帮我一个忙吗,你会在第一个图中旋转极坐标函数中的线,同时当我在第二个数字中按下按钮时,极坐标函数也与图 1 平行工作如果你的答案请告诉我。谢谢
  • 先生,如果您对指南有任何想法,请通过指南提供代码或其他明智的五个您在上面提供的代码,通过指南提供代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
相关资源
最近更新 更多