Main Content

타이머 대기 충돌 처리하기

다중 실행 시나리오에서 작업량이 많은 때에는, 타이머가 이전에 대기열에 넣은 콜백 함수 실행이 완료되기 전에 타이머 콜백 함수(TimerFcn)를 MATLAB® 실행 대기열에 추가해야 할 수 있습니다. BusyMode 속성은 ExecutionMode 속성이 FixedRate로 설정된 경우에만 동작에 영향을 미칩니다. ExecutionMode가 다른 값으로 설정된 경우, 실행 사이의 지연은 항상 이전 실행의 완료를 기준으로 하기 때문에 타이머 콜백 함수를 중첩해서 실행하려고 시도할 수 없습니다.

다음 모드 중 하나를 사용하도록 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(타이머 시작)타이머 대기열에 TimerFcn을 추가합니다.없음
0 + 대기열 지연수행되는 동작이 없습니다.첫 번째 TimerFcn 호출
1대기열에 두 번째 TimerFcn 호출을 추가하려고 시도합니다. 첫 번째 TimerFcn 호출이 아직 실행 중이므로 두 번째 호출을 건너뜁니다.
1.6대기열에 두 번째 TimerFcn 호출을 추가합니다.없음
1.6 + 대기열 지연수행되는 동작이 없습니다.두 번째 TimerFcn 호출
2대기열에 세 번째 TimerFcn 호출을 추가하려고 시도합니다. 두 번째 TimerFcn 호출이 아직 실행 중이므로 세 번째 호출을 건너뜁니다.
3.2대기열에 세 번째 TimerFcn 호출을 추가합니다. 네 번째 호출을 건너뜁니다.없음
3.2 + 대기열 지연대기열에 네 번째 TimerFcn 호출을 추가하려고 시도합니다. 세 번째 TimerFcn 호출이 아직 실행 중이므로 네 번째 호출을 건너뜁니다.세 번째 TimerFcn 호출
3.2
4.8대기열에 네 번째 TimerFcn 호출을 추가합니다. 다섯 번째 호출을 건너뜁니다.없음
4.8 + 대기열 지연대기열에 다섯 번째 TimerFcn 호출을 추가하려고 시도합니다. 네 번째 TimerFcn 호출이 아직 실행 중이므로 다섯 번째 호출을 건너뜁니다.네 번째 TimerFcn 호출
4.8
6.4대기열에 다섯 번째 TimerFcn 호출을 추가합니다.없음
6.4 + 대기열 지연TasksToExecute의 값이 5이므로 mytimer에 더 이상 실행할 콜백이 없습니다.다섯 번째 TimerFcn 호출
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(타이머 시작)타이머 대기열에 TimerFcn을 추가합니다.없음
0 + 대기열 지연수행되는 동작이 없습니다.첫 번째 TimerFcn 호출
1대기열에 두 번째 TimerFcn 호출을 추가하려고 시도합니다. 첫 번째 TimerFcn 호출이 아직 실행 중이므로 첫 번째 TimerFcn 호출이 완료되면 myerror가 대기 상태가 됩니다.
1.6대기열에 myerror를 추가합니다.없음
1.6 + 대기열 지연수행되는 동작이 없습니다.myerror가 호출됨

대기 모드(Queue Mode)

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

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

예를 들어, 위 섹션에 나온 mytimer.m을 수정하여, BusyMode'queue'로 설정해 보십시오.

function mytimer()
    t = timer;

    t.Period         = 1;
    t.ExecutionMode  = 'fixedRate';
    t.TimerFcn       = @mytimer_cb;
    t.ErrorFcn       = @myerror;
    t.BusyMode       = 'queue';
    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첫 번째 콜백 실행을 시작합니다.없음
0 + 대기열 지연수행되는 동작이 없습니다.첫 번째 TimerFcn 호출
1두 번째 콜백 실행을 시작하려고 시도합니다. 첫 번째 실행이 완료되지 않았으므로 실행 대기열은 빈 상태로 유지됩니다.
1.6타이머가 대기열에 두 번째 콜백을 추가합니다.없음
1.6 + 대기열 지연수행되는 동작이 없습니다.두 번째 TimerFcn 호출
2세 번째 콜백 실행을 추가하려고 시도합니다. 두 번째 실행이 완료되지 않았으므로 실행 대기열은 빈 상태로 유지됩니다.
3 네 번째 콜백 실행을 시작하려고 시도합니다. 두 번째 실행이 완료되지 않았으므로 실행 대기열은 빈 상태로 유지됩니다.
3.2두 번째 콜백 실행을 마칩니다. 타이머가 대기열에 세 번째와 네 번째 콜백을 추가하고 세 번째 콜백을 실행합니다. 실행 대기열에는 네 번째 콜백이 포함됩니다.없음
3.2 + 대기열 지연수행되는 동작이 없습니다.세 번째 TimerFcn 호출
4다섯 번째와 마지막 콜백 실행을 시작하려고 시도합니다. 세 번째 실행이 완료되지 않았습니다. 실행 대기열에는 네 번째 콜백이 포함됩니다.
4.8세 번째 콜백 실행을 마칩니다. 타이머가 대기열에 다섯 번째 콜백을 추가하고 네 번째 콜백을 실행합니다. 실행 대기열에는 다섯 번째 콜백이 포함됩니다.없음
4.8 + 대기열 지연TasksToExecute의 값이 5이므로 mytimer에 더 이상 실행할 콜백이 없습니다.네 번째 TimerFcn 호출
6.4없음
6.4 + 대기열 지연다섯 번째 TimerFcn 호출
8

참고 항목

관련 항목