2009-02-26 8 views
1

MatLab을 사용하고 있는데 두 개의 GUI가 있습니다. 하나의 GUI에서 푸시 버튼을 클릭하면 두 번째 GUI가 호출되고 두 GUI가 모두 병렬로 작동 할 수 있습니다. 어떤 신체가이 질문에 대한 답을 알고 있다면 나에게 답을주십시오.MatLab에서 두 개의 GUI를 병렬로 실행하려면 어떻게해야합니까?

두 개의 GUI 양식이 있습니다. 첫 번째에서는 원형으로 선을 회전합니다 (극좌표 기능을 사용하여 레이더 시뮬레이션 목적을위한 것입니다). 그 GUI에는 하나의 푸시 버튼이 있습니다. 내가 for line을 눌러서 (for loop와 pause function을 사용하여) 실제로는 동그라미에서 회전하는 것처럼 보이는 시뮬레이션이다.

동일한 GUI에서 다른 푸시 버튼을 누를 때까지 원이 회전한다. 하나 이상의 푸시 버튼이 있습니다. 이 키를 누르면 다른 GUI에서 동일한 순환을하지만 전체 원 (원의 일부)이 활성화되지 않습니다. 그래서 여기서 저는 원형과 섹터 순환 모두에서 선이 필요합니다. 하지만 실제로 원 GUI의 푸시 버튼에서 섹터 GUI (두 번째 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 

는 사람이 얼마나 지속적으로 색상을 변경하고 두 인물에 지속적으로 극성 함수에서 선을 회전하는 날을 제안 할 수 있습니까?

+0

질문을 명확하게하십시오. 당신이 묻고있는 것이 명확하지 않습니다. –

+0

당신이 무엇을 요구하고 있는지는 아직 불분명합니다. 아마도 당신은 질문을 편집하고 지금까지 가지고있는 코드를 추가하여 자신이하는 일을 정확하게 볼 수있을 것입니다. 내 최고의 추측은 당신이 동시에 업데이 트하려는 원형 다이얼이있는 두 개의 GUI가 있다는 것입니다 ... 맞습니까? – gnovice

+0

예 exacltly u는 할 수있는 경우, 그 대답을 주시겠습니까 –

답변

3

편집 : 난 당신이 가이드에서이 작업을 수행하는 방법에 대한 답변을 원하는 알고 있지만, 어쩌면 당신은 다음 코드는 레이더 GUI를 생성

이 아닌 가이드, 도움이 중첩 된 기능 대답을 ... 찾을 수 있습니다 폴라 플롯과 2 개의 버튼이있는 창. "시작"버튼은 라인을 시계 반대 방향으로 회전하기 시작하고 버튼은 "정지"버튼으로 바뀝니다 (다시 누르면 회선이 회전하지 않습니다). 두 번째 버튼은 섹터 GUI를 시작합니다. 이 수치는 레이다 GUI 선의 현재 위치에서 45도 범위 내에서 극선의 단면을 따라 선이 회전하는 극좌표를가집니다. 애니메이션을 제어하기 위해 섹터 GUI에 또 다른 "시작"/ "중지"버튼이 있습니다. 섹터 GUI가 열려있는 동안 레이더 GUI는 움직이지 않습니다. 섹터 GUI가 닫히면 레이더 GUI가 다시 회전 할 수 있습니다. 한 번에 하나의 섹터 GUI 만 열 수 있습니다. 당신은 회전 속도를 조정하거나 섹터 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 

, 당신은 함수의 시작 부분에 "radarStep"와 "sectorWidth"변수의 값을 조정할 수 있습니다. 희망이 도움이!

+0

친애하는 gnovice 내 문제는 병렬 컴퓨팅 도구 상자에 관련이 없습니다 내가 다시 명확하게 문제를 설명하고 내가 어디에 하나의 GUI가 극지 그 음모를 꾸몄다 극좌표 중심에서 그 선에 그 선이 그 동그라미로 그려진 회전 –

+0

내가 푸시 putton을 통해이 gui에서 두 번째 gui를 호출 할 때 다른 gui가 첫 번째 secondally와 동일한 functioality와 함께 병렬로 실행합니다. 만약 당신이 제발 나를 도와주세요. –

+0

친애하는 gnovice 거의 문제 당신이 설명한 것과 동일합니다, 가이드를 사용하여 같은 코드를 줄 수 있습니까, 나는 프로그래밍 방식으로 생각합니다, 그것은 나를 혼란하지만 위의 코드의 출력이 실행되고 있지만 가이드 GUI를 통해 이것을 필요로하기 때문에 가이드를 쓰는 가이드에서 코드를 제공 할 것입니다 고맙습니다. mr.gnovice –

9

두 개 이상의 GUI가 데이터를 공유하고 함께 작업하는 방법을 다루는 비디오를 만들었습니다. 간단한 대답은 SETAPPDATA와 GETAPPDATA를 사용하여 GUI간에 데이터를 공유하는 것입니다. 긴 대답은 여기에 있습니다 :

GUI 비디오의 내 컬렉션은 여기에서 찾을 수 있습니다

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

:

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

더그

+0

죄송합니다! 나는 내 대답에 당신의 블로그에 연결하는 것을 게을리했다. 나는이 예를 든 MathWorks 사람들이 있다는 것을 알고있었습니다. =) – gnovice

+0

친애하는 doug 내 문제는 병렬 컴퓨팅 도구 상자와 관련이 없습니다 내가 다시 명확하게 문제를 좀 더 명확하게 설명하고 있는데 내가 어디 그 극좌표 그 극지 중심에 극지를 그릴 동그라미 그 라인 회전 그 라인 –

+0

때 두 번째 gui를 푸시 putton 통해 다른 gui를 호출합니다 첫 번째 초 병렬 parallely 같은 functioality 둘 다 당신이 나를 도와주십시오 알고 있다면 병렬로 작동 –

1

을 문제는 그 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 
+0

Thanq french는 나를 위해 한 번 더 호의 할 수 있습니다. 동시에 극좌표에서 극좌표 함수의 선을 회전시킬 수 있습니다. 동시에 두 번째 그림에서 버튼을 누르면 극좌표 함수도 그림 1과 평행하게 작용합니다. 대답 해주세요. 감사합니다 –

+0

선생님, 만약 당신이 가이드에 대한 아이디어가 있다면 가이드 또는 다른 현명한 5 위의 코드가 가이드를 통해 코드를 제공하여 코드를 제공하십시오 –

관련 문제