티스토리 뷰

개요
Timer 객체의 timer 이벤트 발생시 콜백 함수에서 Timer 객체의 currentCount 가 repeatCount 와 같을때 stop() 메소드를 사용하는 경우 Tick 함수가 완전히 끝나기 전에 timerComplete 이벤트가 발생됩니다.
 
일정 시간마다 반복되는 작업을 하기위해 Timer 객체를 사용하는데, Timer 객체에 이벤트를 등록하면 일정시간마다 timer 이벤트가 발생됩니다. Timer 객체가 지정된 횟수만큼 모두 실행이 되면 TIMER_COMPLETE 이벤트가 발생됩니다.

코드
var A:Timer = new Timer(500, 2);
    A.addEventListener(TimerEvent.TIMER, A_onTick)
    A.addEventListener(TimerEvent.TIMER_COMPLETE, A_onComplete);
    A.start();

var B:Timer = new Timer(100, 1);
    B.addEventListener(TimerEvent.TIMER, B_onTick)
    B.addEventListener(TimerEvent.TIMER_COMPLETE, B_onComplete);

function A_onTick(tevent:TimerEvent):void
{
    trace("A.onTick() : current="+ A.currentCount);

    // 첫번째 타이머 정지
    A.stop();
    trace("  - A stopped.");

    // 두번째 타이머 실행
    B.reset();
    B.start();
    trace("  - B started.");
}

function A_onComplete(tevt:TimerEvent):void
{
    trace("A.onComplete() : "+ A.repeatCount);
}

function B_onTick(tevt:TimerEvent):void
{
    trace("A > B.onTick() : current="+ B.currentCount);
}

function B_onComplete(tevt:TimerEvent):void
{
    trace("A > B.onComplete() : repeats="+ B.repeatCount);

    // A의 하위 타이머 B가 완료되면 상위 타이머 A를 다시 실행
    if (A.currentCount < A.repeatCount)
        A.start();
}

실행을 하면 아래와 같은 결과가 나옵니다.

A.onTick() : current=1
  - A stopped.
  - B started.
A > B.onTick() : current=1
A > B.onComplete() : repeats=1
A.onTick() : current=2
  - A stopped.
  - B started.
A.onComplete() : 2 ← 실제 출력된 위치
A > B.onTick() : current=1
A > B.onComplete() : repeats=1

A.onComplete() : 2 ← 프로그래머가 의도했던 출력 위치 (물론 위 코드대로라면 출력은 안됨)


A 타이머의 실행횟수가 현재 실행횟수와 같을때 stop() 을 하게되면, 바로 TIMER_COMPLETE 이벤트가 일어나며 A.onComplete() 함수가 실행됩니다. 원래 의도한 대로라면 B.onComplete() 가 실행이 완료된 후 실행이 되어야 했죠.

결론
이것은 액션 스크립트 3 가 이벤트 모델 방식이기 때문에 당연한 결과라서 버그라 볼 수는 없습니다. -_-;
타이머 객체에 따로 타이머의 일시정지, 계속의 메소드가 없기 때문에, stop() 메소드를 호출했을 경우 바로 타이머가 정지되어 버리는 것이죠.

간단한 해결책으로는 실행횟수(repeat count)를 더 많게 설정해서 체크를 해주는 방법이 있지만, 미세한 타이머 작업의 경우 약간 지연되거나 하는 문제가 생길 수 있습니다. -_-;

var timer:Timer = new Timer(100, 2 +1);// 실행횟수를 +1 많게
//...
function onTick(tevt:TimerEvent)
{
    // 타이머 객체의 실행횟수를 체크하여 최종 실행횟수인 repeatCount -1 값과 같으면 그냥 리턴
    if (timer.currentCount == timer.repeatCount -1)
        return false;
}
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함