Main Content

콜백 실행 중단하기

MATLAB®에서는 콜백 함수가 실행 중일 때 이를 중단할 수 있을지를 제어할 수 있습니다. 때로는 중단이 가능하게 하고자 할 수 있습니다. 예를 들어 애니메이션을 중단하는 콜백을 만들어 사용자가 애니메이션 루프를 중지하도록 할 수 있습니다. 실행중 콜백의 순서가 중요할 때 잠재적 중단을 방지하고자 하는 경우가 있을 수 있습니다. 예를 들어 앱의 반응성을 높이기 위해 포인터 이동에 반응하는 콜백이 중단되지 않도록 방지할 수 있습니다.

중단된 콜백 동작

콜백 함수는 대기열 내 순서에 따라 실행됩니다. 콜백이 실행 중일 때 사용자 동작이 두 번째 콜백을 트리거하면 두 번째 콜백은 첫 번째 콜백을 중단하려고 시도합니다. 첫 번째 콜백은 실행중 콜백입니다. 두 번째 콜백은 인터럽트 콜백입니다.

실행중 콜백에서 특정 명령이 발생하는 경우 MATLAB이 콜백 대기열의 나머지 항목을 처리합니다. MATLAB은 이러한 명령 중 하나를 실행할 때마다 콜백 중단 동작을 결정합니다. 이러한 명령으로는 drawnow, figure, uifigure, getframe, waitfor, pause 등이 있습니다.

실행중 콜백에 이러한 명령이 전혀 포함되지 않은 경우 중단이 발생하지 않습니다. MATLAB은 실행중 콜백에 대한 실행을 먼저 마치고 이후에 인터럽트 콜백을 실행합니다.

실행중 콜백에 이러한 명령 중 하나가 포함된 경우 실행중 콜백을 소유한 객체의 Interruptible 속성에 따라 중단의 발생 여부가 결정됩니다.

  • Interruptible의 값이 'on'이면 중단이 발생합니다. 콜백 대기열을 처리할 때 MATLAB은 실행중 콜백의 실행을 일시 중지하고 인터럽트 콜백을 실행합니다. 인터럽트 콜백이 완료되면 MATLAB은 실행중 콜백의 실행을 재개합니다.

  • Interruptible의 값이 'off'이면 중단이 발생하지 않습니다. 그 대신 인터럽트 콜백의 BusyAction 속성에 따라 인터럽트 콜백에 대한 MATLAB의 동작이 결정됩니다.

    • BusyAction의 값이 'queue'이면 MATLAB은 실행중 콜백이 완료된 후에 인터럽트 콜백을 실행합니다.

    • BusyAction의 값이 'cancel'이면 MATLAB은 인터럽트 콜백을 무시합니다.

Interruptible의 디폴트 값은 'on'이고, BusyAction의 디폴트 값은 'queue'입니다.

마지막으로 인터럽트 콜백이 DeleteFcn, CloseRequestFcn 또는 SizeChangedFcn 콜백인 경우에는 Interruptible 속성의 값에 상관없이 중단이 발생합니다.

콜백 중단 동작 제어하기

이 예제에서는 Interruptible 컴포넌트 속성과 BusyAction 컴포넌트 속성이 어떻게 상호 작용하여 서로 다른 유형의 콜백 중단 동작을 생성하는지 보여줍니다.

현재 폴더에 callbackBehavior.m이라는 파일을 만들고 그 파일에서 같은 이름의 함수를 정의합니다. 이 함수는 두 개의 Figure 창을 가지며 각 Figure 창에 두 개의 버튼이 있는 앱을 만듭니다. 버튼 각각은 ButtonPushedFcn 콜백과 서로 다른 콜백 실행 속성값을 갖습니다. 한 버튼을 클릭한 다음 그 첫 번째 버튼 동작이 끝나기 전에 두 번째 버튼을 클릭하면 두 번째 버튼의 콜백이 첫 번째 버튼의 콜백을 중단하려고 시도합니다. 첫 번째 창의 버튼은 클릭되면 진행률 대화 상자를 표시하고 업데이트합니다. 두 번째 창의 버튼은 클릭되면 데이터를 플로팅합니다. 두 버튼에 대한 중단 동작을 정의하여 어떠한 동작이 발생할지 제어할 수 있습니다.

function callbackBehavior
% Create the figures and grid layouts
fig1 = uifigure('Position',[400 600 500 150]);
g1 = uigridlayout(fig1,[2,2]);
fig2 = uifigure('Position',[400 100 500 400]);
g2 = uigridlayout(fig2,[3,2], ...
    'RowHeight', {'1x','1x','8x'});

% Create the label for the first figure window
lbl1 = uilabel(g1,'Text','1. Click a button to clear the axes and generate a progress dialog.');
lbl1.Layout.Column = [1 2];
lbl1.HorizontalAlignment = 'center';

% Create the buttons that create a progress dialog
interrupt = uibutton(g1, ...
    'Text','Wait (interruptible)', ...
    'Interruptible','on', ...
    'ButtonPushedFcn',@createProgressDlg);
nointerrupt = uibutton(g1, ...
    'Text','Wait (not interruptible)', ...
    'Interruptible','off', ...
    'ButtonPushedFcn',@createProgressDlg);

% Create the label for the second figure window
lbl2 = uilabel(g2,'Text','2. Click a button to plot some data.');
lbl2.Layout.Column = [1 2];
lbl2.HorizontalAlignment = 'center';

% Create the axes
ax = uiaxes(g2);
ax.Layout.Row = 3;
ax.Layout.Column = [1 2];

% Create the buttons to plot data
queue = uibutton(g2, ...
    'Text','Plot (queue)', ...
    'BusyAction','queue', ...
    'ButtonPushedFcn',@(src,event)surf(ax,peaks(35)));
queue.Layout.Row = 2;
queue.Layout.Column = 1;

cancel = uibutton(g2, ...
    'Text','Plot (cancel)', ...
    'BusyAction','cancel', ...
    'ButtonPushedFcn',@(src,event)surf(ax,peaks(35)));
cancel.Layout.Row = 2;
cancel.Layout.Column = 2;

    % Callback function to create and update a progress dialog
    function createProgressDlg(src,event)
        % Clear axes
        cla(ax,'reset')
        % Create the dialog
        dlg = uiprogressdlg(fig1,'Title','Please Wait',...
        'Message','Loading...');
        steps = 250;
        for step = 1:steps 
            % Update progress
            dlg.Value = step/steps;
            pause(0.01)
        end
        close(dlg)
    end
end

callbackBehavior 함수를 호출하여 Figure 창을 표시합니다.

callbackBehavior

Figure contains an object of type uigridlayout.

Figure contains an axes object and an object of type uigridlayout. The axes object is empty.

버튼 쌍을 클릭하여, Interruptible 속성값과 BusyAction 속성값의 다양한 조합이 어떠한 영향을 미치는지 살펴봅니다.

  • 콜백 중단 — Wait (interruptible)을 클릭하고 곧바로 두 번째 창에서 Plot (queue) 또는 Plot (cancel) 버튼 중 하나를 클릭하는 경우. 첫 번째 버튼의 Interruptible 값이 'on'으로 설정되기 때문에 중단이 발생합니다. 진행률 대화 상자가 계속 실행되는 동안 플롯이 표시됩니다.

  • 콜백 대기 — Wait (not interruptible)을 클릭하고 곧바로 Plot (queue)를 클릭하는 경우. 첫 번째 버튼의 Interruptible 값이 'off'로 설정되고 두 번째 버튼의 BusyAction 값이 'queue'로 설정되기 때문에, 대기가 발생합니다. 진행률 대화 상자는 완료될 때까지 실행됩니다. 그런 다음 플롯이 표시됩니다.

  • 콜백 취소 — Wait (not interruptible)을 클릭하고 곧바로 Plot (cancel)을 클릭하는 경우. 첫 번째 버튼의 Interruptible 값이 'off'로 설정되고 두 번째 버튼의 BusyAction 값이 'cancel'로 설정되기 때문에, 취소가 발생합니다. 진행률 대화 상자는 완료될 때까지 실행됩니다. MATLAB이 플롯 콜백을 무시했기 때문에 플롯은 표시되지 않습니다.

참고 항목

| | |

관련 항목