2012-06-16 1 views
1

К сожалению, у меня есть две петли. поэтому мой код запускает первый цикл и только когда он завершен, он запускает второй цикл.Matlab одновременно запускает петли

Но я хочу, чтобы gui отображал данные одновременно: в hAxes и в load1.

Как это сделать?

hFigure = figure('units','pixels','position',[300 300 424 470],'menubar','none',... 
'name','start processing','numbertitle','off','resize','off');   

hAxes = axes('Parent',hFigure,'Units','pixels','Position',[0 112 424 359]); 

loading1 = uicontrol('style','text','unit','pix','position',[0 72 424 40],... 
'backgroundcolor','r','fontsize',20); 

%% shows the data on hAxes 
for i = 5:100 
    if mod(i,2) == 0 
     set(hAxes,'Color','b'); 
    else 
     set(hAxes,'Color','g'); 
    end 
    drawnow; 
end 

%% shows the data on loading1 
for i=1:200 
    image2 = horzcat('now processing ', 'image', num2str(i), '.jpg of 200 images'); 
    set(loading1,'string',image2); 
    drawnow; 
end 

этот код Петра:

function test1 

    hFigure = figure('units','pixels','position',[300 300 424 470],'menubar','none','name','start processing','numbertitle','off','resize','off'); 

    % Your other setup calls 
    hAxes = axes('Parent',hFigure,'Units','pixels','Position',[0 112 424 359]); 

    loading1 = uicontrol('style','text','unit','pix','position',[0 72 424 40],'backgroundcolor','r','fontsize',20); 

    c = 1; 
    t = timer('TimerFcn', @color_change_fcn,'StartDelay',1.0); 
    start(t); 

    for i=1:200 
     image2 = horzcat('now processing ', 'image', num2str(i), '.jpg of 200 images'); 
     set(loading1,'string',image2); 
     drawnow; 
    end 

    function color_change_fcn 
     if mod(c,2) == 0 
      set(hAxes,'Color','b'); 
     else 
      set(hAxes,'Color','g'); 
     end 
     drawnow; 
     c = c + 1; 
    end 
end 

Это не работает (не показывает hAxes). Я видел, что это не делает прогон color_change_fcn (я попытался написать: disp ('test') в первой строке функции color_change_fcn, но ничего не печатает.

+1

Вы можете использовать Parallel Computing Toolbox и конструкцию parfor, но я предлагаю вам объединить две петли, как-то так, что у вас есть детерминированное поведение. – Ansari

+0

@ Ансари, я знаю, что могу использовать то, что Питер написал мне в своем комментарии, но я объясню ему причину. прочитайте мой ответ ему и скажите, могу ли я сделать это с помощью инструментария параллельных вычислений. –

ответ

1

Это похоже на ваш previous question, где вы хотите, чтобы две петли работали одновременно (как минимум, по-видимому, так).

Опираясь на ответ @Peter «s, рассмотрит следующий рабочий пример:

function timerDemo() 
    %# prepare GUI 
    hFig = figure('Menubar','none', 'Resize','off'); 
    axes('XLim',[0 1], 'YLim',[0 1], 'Visible','off', ... 
     'Units','normalized', 'Position',[0.1 0.2 0.8 0.6]) 
    hTxt = uicontrol('Style','text', 'FontSize',24, ... 
     'Units','normalized', 'Position',[0 0.9 1 0.1]); 
    hPatch = patch([0 0 1 1 0],[0 1 0 1 0],'k'); 

    %# colors to cycle through 
    c = 1; 
    clr = lines(4); 

    %# create timer 
    delay = 0.5; 
    hTimer = timer('Period',delay, 'StartDelay',delay, ... 
     'ExecutionMode','FixedRate', 'TimerFcn',@timerCallback); 

    %# when figure is closed 
    set(hFig, 'CloseRequestFcn',@onClose); 

    %# process images 
    start(hTimer);   %# start timer 
    for i=1:100 
     if ~ishandle(hFig), break; end 

     msg = sprintf('Processing image %d/%d', i, 100); 
     set(hTxt, 'String',msg) 

     %# some lengthy operation 
     pause(.1) 
    end 
    if isvalid(hTimer) 
     stop(hTimer)  %# stop timer 
     delete(hTimer)  %# delete timer 
    end 

    %# timer callback function 
    function timerCallback(src,evt) 
     if ~ishandle(hFig), return; end 

     %# incremenet counter circularly 
     c = rem(c,size(clr,1)) + 1; 

     %# update color of patch 
     set(hPatch, 'FaceColor',clr(c,:)); 
     drawnow 
    end 

    %# on figure close 
    function onClose(src,evt) 
     %# stop and delete timer 
     if isvalid(hTimer) 
      stop(hTimer); 
      delete(hTimer); 
     end 

     %# call default close callback 
     feval(@closereq) 
    end 
end 

Код имитирует запуск длительного этапа обработки на ряде изображений, в то же время показывая анимацию, чтобы пользователь развлекаться.

Чтобы код был прост, я показываю патч, который постоянно обновляет его цвет (используя таймер). Это обозначает animated GIF image «loading ...».

screenshot

+0

У меня есть проект по обработке изображений в моем университете. У меня нет никаких знаний об обработке изображений и Matlab. Благодаря вам и некоторым парням мне удалось сделать большую часть этого проекта. это потрясающе! поэтому я хочу поблагодарить вас от всего сердца! –

1

Это то, что вы хотите? Совместите тела петли .

for i=1:200 
    if mod(i,2) == 0 
     set(hAxes,'Color','b'); 
    else 
     set(hAxes,'Color','g'); 
    end 

    image2 = horzcat('now processing ', 'image', num2str(i), '.jpg of 200 images'); 
    set(loading1,'string',image2); 
    drawnow; 
end 

EDIT: Хорошо, в таком случае, попробуйте таймер вместо первого контура

function output = main_function 

% Your other setup calls 
hAxes = axes('Parent',hFigure,'Units','pixels','Position',[0 112 424 359]); 

c = 0; 
t = timer('TimerFcn', @color_change_fcn, 'Period', 1.0); 
start(t); 

for i=1:200 
    image2 = horzcat('now processing ', 'image', num2str(i), '.jpg of 200 images'); 
    set(loading1,'string',image2); 
    drawnow; 
end 

function color_change_fcn 
    if mod(c,2) == 0 
     set(hAxes,'Color','b'); 
    else 
     set(hAxes,'Color','g'); 
    end 
    drawnow; 
    c = c + 1; 
end 
end 

Просто помните, что поток управления MATLAB является по своей сути однопоточный, так что эти обратные вызовы не будут если MATLAB занят работой в другом месте.

+0

нет, я просто вставлю образец. в моем реальном коде мне приходится вычислять много данных во втором цикле, а в первом цикле я хочу показывать снимки (пока пользователь не закроет рисунок). поэтому, если я знаю, как это сделать в этом примере, я бы знал, как это сделать в моем коде. но спасибо за ваш комментарий. –

+0

Привет, Питер, я обновил код моей темы. прочитайте. обратите внимание, что в «t = timer (...)» я заменил слово «Период» на «StartDelay». Я делаю это, потому что в опции «Период» у меня есть ошибка: ??? Ошибка при оценке TimerFcn для таймера 'timer-30' Слишком много входных аргументов. спасибо. –