이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

타이머 대기 충돌 처리하기

다중 실행 시나리오에서 작업량이 많은 때에는, 타이머가 이전에 대기열에 넣은 콜백 함수 실행이 완료되기 전에 타이머 콜백 함수(TimerFcn)를 MATLAB® 실행 대기열에 추가해야 할 수 있습니다. 다음 모드 중 하나를 사용하도록 BusyMode 속성을 설정하여 timer 객체가 이 시나리오를 처리하는 방식을 결정할 수 있습니다.

건너뛰기 모드(Drop Mode) (디폴트 값)

BusyMode 속성의 값으로 'drop'을 지정하는 경우 timer 객체는 실행 대기열이 비어 있을 때만 타이머 콜백 함수를 실행 대기열에 추가합니다. 실행 대기열이 비어 있지 않으면 timer 객체는 콜백 실행을 건너뜁니다.

예를 들어, 아래 mytimer.m에서와 같이 기간을 1초로 지정하여 타이머를 만들고, 콜백을 실행하는 데는 최소 1.6초가 필요하다고 가정하겠습니다.

function mytimer()
    t = timer;

    t.Period         = 1;
    t.ExecutionMode  = 'fixedRate';
    t.TimerFcn       = @mytimer_cb;
    t.BusyMode       = 'drop';
    t.TasksToExecute = 5;
    t.UserData       = tic;

    start(t)
end


function mytimer_cb(h,~)
    timeStart = toc(h.UserData)
    pause(1.6);
    timeEnd = toc(h.UserData)
end

다음 표에서는 타이머가 실행 대기열을 관리하는 방법을 설명합니다.

대략적인 경과 시간(초)

동작

0

첫 번째 콜백 실행을 시작합니다.

1

두 번째 콜백 실행을 시작하려고 시도합니다. 첫 번째 실행이 완료되지 않았지만, 실행 대기열은 비어 있습니다. 타이머가 대기열에 콜백을 추가합니다.

1.6

첫 번째 콜백 실행을 마치고 두 번째 콜백 실행을 시작합니다. 이 동작은 실행 대기열을 지웁니다.

2

세 번째 콜백 실행을 시작하려고 시도합니다. 두 번째 실행이 완료되지 않았지만, 대기열은 비어 있습니다. 타이머가 대기열에 콜백을 추가합니다.

3

네 번째 콜백 실행을 시작하려고 시도합니다. 세 번째 콜백이 실행 대기열에 있으므로, 타이머는 이 함수 실행을 건너뜁니다.

3.2

두 번째 콜백 실행을 마치고 세 번째 콜백 실행을 시작하여 실행 대기열을 지웁니다.

4

또 다른 콜백 실행을 시작하려고 시도합니다. 대기열이 비어 있으므로, 타이머가 대기열에 콜백을 추가합니다. 이는 다섯 번째 시도이지만, 네 번째로 실행되는 인스턴스입니다.

4.8

세 번째 실행을 마치고 네 번째 인스턴스를 시작하여 대기열을 지웁니다.

5

또 다른 콜백을 시작하려고 시도합니다. 인스턴스가 실행 중이지만 실행 대기열은 비어 있으므로, 타이머가 대기열에 콜백을 추가합니다. 이는 다섯 번째로 실행되는 인스턴스입니다.

6

아무 작업도 하지 않습니다. TasksToExecute 속성의 값은 5이고, 실행할 다섯 번째 인스턴스가 대기열에 있습니다.

6.4

네 번째 콜백 실행을 마치고 다섯 번째 콜백 실행을 시작합니다.

8

다섯 번째 콜백 실행을 마칩니다.

오류 모드(Error Mode)

BusyMode 속성의 'error' 모드는 'drop' 모드와 비슷합니다. 두 모드 다 타이머는 실행 대기열에 하나의 콜백 인스턴스만을 허용합니다. 그러나 'error' 모드에서는 대기열이 비어 있지 않은 경우, 타이머는 ErrorFcn 속성을 사용하여 지정한 함수를 호출한 다음 처리를 중지합니다. 현재 실행 중인 콜백 함수는 완료되지만, 대기열에 있는 콜백은 실행되지 않습니다.

예를 들어, 위 섹션에 나온 mytimer.m을 수정하여, 오류 처리 함수를 포함시키고 BusyMode'error'로 설정해 보십시오.

function mytimer()
    t = timer;

    t.Period         = 1;
    t.ExecutionMode  = 'fixedRate';
    t.TimerFcn       = @mytimer_cb;
    t.ErrorFcn       = @myerror;
    t.BusyMode       = 'error';
    t.TasksToExecute = 5;
    t.UserData       = tic;

    start(t)
end


function mytimer_cb(h,~)
    timeStart = toc(h.UserData)
    pause(1.6);
    timeEnd = toc(h.UserData)
end

function myerror(h,~)
    disp('Reached the error function')
end

다음 표에서는 타이머가 실행 대기열을 관리하는 방법을 설명합니다.

대략적인 경과 시간(초)

동작

0

첫 번째 콜백 실행을 시작합니다.

1

두 번째 콜백 실행을 시작하려고 시도합니다. 첫 번째 실행이 완료되지 않았지만, 실행 대기열은 비어 있습니다. 타이머가 대기열에 콜백을 추가합니다.

1.6

첫 번째 콜백 실행을 마치고 두 번째 콜백 실행을 시작합니다. 이 동작은 실행 대기열을 지웁니다.

2

세 번째 콜백 실행을 시작하려고 시도합니다. 두 번째 실행이 완료되지 않았지만, 대기열은 비어 있습니다. 타이머가 대기열에 콜백을 추가합니다.

3

네 번째 콜백 실행을 시작하려고 시도합니다. 실행 대기열에 세 번째 콜백이 있습니다. 타이머는 세 번째 콜백을 실행하지 않고, 대신 오류 처리 함수를 호출합니다.

3.2

두 번째 콜백을 마치고 오류 처리 함수를 시작합니다.

대기 모드(Queue Mode)

'queue'를 지정하면 timer 객체는 현재 실행 중인 콜백 함수가 완료될 때까지 기다린 후에 다음 타이머 콜백 함수 실행을 대기열에 넣습니다.

'queue' 모드에서 timer 객체는 각 실행 간의 평균 시간을 Period 속성에 지정된 시간과 같게 만들려고 합니다. 타이머 함수 콜백 실행 간의 대기 시간이 Period 속성에 지정된 시간보다 더 긴 경우, timer 객체는 시간을 맞추기 위해 이후 실행 시간을 단축합니다.

참고 항목

관련 항목