콜백 실행 중단하기
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
버튼 쌍을 클릭하여, 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이 플롯 콜백을 무시했기 때문에 플롯은 표시되지 않습니다.
참고 항목
timer
| drawnow
| waitfor
| uiwait