콜백 실행 중단하기

MATLAB®에서는 실행 중인 콜백 함수의 중단 가능 여부를 제어할 수 있습니다. 예를 들어, 애니메이션을 중단하는 콜백을 만들어 사용자가 애니메이션 루프를 중지하도록 허용할 수 있습니다. 또는 실행 중인 콜백의 순서가 중요한 경우, 작업이 중단되지 않도록 할 수 있습니다. 예를 들어, 이미지의 여러 부분을 보여주는 WindowButtonMotionFcn 콜백이 중단되는 것을 막을 수 있습니다.

중단을 제어하는 방법

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

2개의 속성값이 중단 시도에 대한 응답을 제어합니다.

  • 실행중 콜백을 소유한 객체의 Interruptible 속성은 중단이 허용되는지 여부를 지정합니다. 'on' 값은 중단을 허용합니다. 'off' 값은 중단을 허용하지 않습니다. 디폴트 값은 'on'입니다.

  • 중단이 허용되지 않으면, 인터럽트 콜백을 소유한 객체의 BusyAction 속성에 따라 MATLAB이 인터럽트 콜백을 대기열에 넣을지 또는 무시할지가 결정됩니다. 'queue' 값은 실행중 콜백이 실행을 마치면 인터럽트 콜백이 실행되도록 허용합니다. 'cancel' 값은 인터럽트 콜백을 무시합니다. 디폴트 값은 'queue'입니다.

중단이 허용되는 경우의 콜백 동작

객체의 Interruptible 속성이 'on'으로 설정되어 있으면 다음에 drawnow, figure, getframe, waitfor, pause, waitbar 중 하나가 실행될 때 객체의 콜백이 중단될 수 있습니다.

  • 실행중 콜백에 이러한 명령 중 하나가 포함되어 있으면 MATLAB은 실행중 콜백의 실행을 중지하고 인터럽트 콜백을 실행합니다. 인터럽트 콜백이 완료되면 MATLAB은 실행중 콜백의 실행을 재개합니다.

  • 실행중 콜백에 이러한 명령 중 하나가 포함되어 있지 않으면 MATLAB은 중단 없이 콜백 실행을 마칩니다.

interruptible 속성과 그 효과에 대한 자세한 내용은 UIControl 속성 페이지의 Interruptible 속성 설명을 참조하십시오.

예제

다음 예제에서는 Interruptible 속성과 BusyAction 속성 및 대기 표시줄을 사용하여 콜백 중단을 제어하는 방법을 보여줍니다.

소스 파일 복사하기

  1. MATLAB에서 현재 폴더를 쓰기 권한이 있는 폴더로 설정합니다.

  2. 다음 MATLAB 명령을 실행합니다.
    copyfile(fullfile(docroot, 'techdoc','creating_guis','examples',...
    'callback_interrupt.m')),fileattrib('callback_interrupt.m', '+w');

예제 코드 실행하기

명령 callback_interrupt를 실행합니다. 프로그램에 2개의 창이 표시됩니다.

여러 버튼 쌍을 클릭하면 다양한 속성값 조합의 효과를 확인할 수 있습니다.

  • 콜백 중단Wait (interruptible)을 클릭하고 바로 이어서 두 번째 창에 있는 두 버튼 Surf Plot (queue) 또는 Mesh Plot (cancel) 중 하나를 클릭합니다. 대기 표시줄이 표시되지만 플로팅 작업에 의해 잠시 중단됩니다.

  • 콜백 대기Wait (uninterruptible)을 클릭하고 바로 다음 창에 있는 Surf Plot (queue)를 클릭합니다. 대기 표시줄이 완료될 때까지 실행됩니다. 그런 다음, 곡면 플롯이 표시됩니다.

  • 콜백 취소Wait (uninterruptible)을 클릭하고 바로 다음 창에 있는 Mesh Plot (cancel)을 클릭합니다. 대기 표시줄이 완료될 때까지 실행됩니다. MATLAB은 mesh 플롯 콜백을 무시하기 때문에 어떤 플롯도 표시되지 않습니다.

소스 코드 살펴보기

각 버튼이 만들어지면 Interruptible 속성과 BusyAction 속성이 uicontrol 함수에 입력 인수로 전달됩니다.

다음은 Wait (interruptible) 누름 버튼을 만드는 명령입니다. Interruptible 속성이 'on'으로 설정된 것을 알 수 있습니다.

h_interrupt = uicontrol(h_panel1,'Style','pushbutton',...
                        'Position',[30,110,120,30],...
                        'String','Wait (interruptible)',...
                        'Tooltip','Interruptible = on',...
                        'Interruptible','on',...
                        'Callback',@wait_interruptible);

다음은 Wait (uninterruptible) 누름 버튼을 만드는 명령입니다. Interruptible 속성이 'off'로 설정된 것을 알 수 있습니다.

h_nointerrupt = uicontrol(h_panel1,'Style','pushbutton',...
                        'Position',[30,40,120,30],...
                        'String','Wait (uninterruptible)',...
                        'Tooltip','Interruptible = off',...
                        'Interruptible','off',...
                        'Callback',@wait_uninterruptible);

다음은 Surf Plot (queue) 누름 버튼을 만드는 명령입니다. BusyAction 속성이 'queue'로 설정된 것을 알 수 있습니다.

hsurf_queue = uicontrol(h_panel2,'Style','pushbutton',...
                        'Position',[30,200,110,30],...
                        'String','Surf Plot (queue)',...
                        'BusyAction','queue',...
                        'Tooltip','BusyAction = queue',...
                        'Callback',@surf_queue);

다음은 Mesh Plot (cancel) 누름 버튼을 만드는 명령입니다. BusyAction 속성이 'cancel'로 설정된 것을 알 수 있습니다.

hmesh_cancel = uicontrol(h_panel2,'Style','pushbutton',...
                        'Position',[30,130,110,30],...
                        'String','Mesh Plot (cancel)',...
                        'BusyAction','cancel',...
                        'Tooltip','BusyAction = cancel',...
                        'Callback',@mesh_cancel);

참고 항목

| | |

관련 항목