Matlab使循环同时运行 [英] Matlab makes the loops run simultaneously

查看:325
本文介绍了Matlab使循环同时运行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

不幸的是,我有两个循环.这就是为什么我的代码使第一个循环运行,并且仅在完成时才使第二个循环运行.

Unfortunately, I have two loops. that's why my code makes the first loop run and only when it is finished, it makes the second loop run.

但是我希望gui同时显示数据:在hAxes和loading1中.

But I want the gui to show the data simultaneously: in the hAxes and in the loading1.

我该怎么做?

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 运行(我试图在 color_change_fcn 函数的第一行中写:disp('test'),但它什么也不打印.

It doesn't work (doesn't show the hAxes). I saw it doesn't make the color_change_fcn run (I tried to write: disp('test') in the first row of color_change_fcn function, but it prints nothing.

推荐答案

这似乎与您的上一个问题有关,您希望两个循环同时运行(至少看起来是这样).

This seems to be related to your previous question, where you want the two loops to be running simultaneously (well at least appear to be that way).

基于 @Peter 的答案,请考虑以下工作示例:

Building on @Peter's answer, consider the following working example:

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

该代码模拟了对许多图像进行冗长的处理步骤,同时显示了动画以使用户感到愉悦.

The code simulates running a lengthy processing step on a number of images, while at the same time showing an animation to keep the user entertained.

为了简化代码,我展示了一个补丁,该补丁会不断更新其颜色(使用计时器).这代表正在加载..."的动画 GIF 图像.

To keep the code simple, I am showing a patch that updates its color continuously (using a timer). This stands for the animated GIF image of "loading...".

这篇关于Matlab使循环同时运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆