관리 메뉴

드럼치는 프로그래머

[C/C++] Linux C - 간단한 Timer 구현 본문

★─Programing/☆─C | C++

[C/C++] Linux C - 간단한 Timer 구현

드럼치는한동이 2013. 4. 17. 10:25

여기서 구현하고자 하는 Timer는 단순히 현재 시간을 얻어오려는 함수가 아니라 일정 시간마다 특정한 함수를 수행하게 해주는 Timer를 말한다. Windows의 onTimer 함수처럼 말이다. Linux에서도 onTimer와 같은 함수를 쉽게 만들 수 있는데, 아래와 같이 구현하면 된다.

 

#include <time.h>
#include <signal.h>
#include <unistd.h>

 

void StartTimer (timer_t timerid, void (*Func)(int), long nsecInterval)
{
    struct itimerspec  value;
    struct sigevent  av_sig_spec;

 

    av_sig_spec.sigev_notify = SIGEV_SIGNAL;
    av_sig_spec.sigev_signo = SIGRTMIN;

 

   value.it_value.tv_sec = 0;
   value.it_value.tv_nsec = nsecInterval;
   value.it_interval.tv_sec = 0;
   value.it_interval.tv_nsec = nsecInterval;

 

    timer_create (CLOCK_REALTIME, &av_sig_spec, timerid);

    timer_settime (*timerid, 0, &value, NULL);

 

    signal(SIGRTMIN+ nIDEvent, Func);
}

 

그리고 main function 같은 곳에서 아래처럼 간단히 불러주면 된다.

 

// timerID, function pointer, interval time (nano second)

StartTimer (timerID, Render, 30 * 1000000);

while(1)

{

     usleep(20);

     if (g_frameNum >= 330)

     {

          timer_delete(timerID);

          break;

     }

}

 

위의 경우는 30ms마다 한 번씩 Render라는 함수가 호출되도록 Timer를 만든 것이다. 30ms마다 한 frame씩 그려서 330 frame을 그린 후에 timer를 삭제하고, while loop를 빠져나가도록 하였다. usleep을 사용한 이유는 Render 함수를 수행하지 않는 동안에 CPU를 다른 프로세스가 쓸 수 잇게 하기 위해서다.

 

 

[출처] http://blog.naver.com/PostView.nhn?blogId=sadiles&logNo=10087786415&redirect=Dlog&widgetTypeCall=true

Comments