ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CALLBACK (콜백) 함수
    Programming 2010. 1. 5. 08:56

    콜백함수란 어떠한 정보(또는 이벤트)를 관리하는 대상이 자신의 정보가 변경되거나 또는 이벤트가 발생할때 
    자신의 변경된 정보나 이벤트에 따른 어떠한 처리를 할 수 있도록 제공하는 함수라고 할 수 있습니다.

    일단 우리 생활에서 예를 들자면

    첫번째 상황.
    철수와 영희가 놀이터에서 놀고있습니다. 철수는 엄마가 오후1시까지 집에 들어오라는 말을 듣고
    시계에게 몇시인지 수시로 물어보다가 1시가되자 집으로 돌아갔습니다.

    두번째 상황.
    철수와 영희가 놀이터에서 놀고있습니다. 철수는 엄마가 오후1시까지 집에 들어오라는 말을 듣고
    시계에게 후1시가 되면 알려달라고 한후 시계가 1시임을 알려주자 집으로 돌아갔습니다.

    일단 위에서는 시계를 사람처럼 표현했습니다.
    실제로는 
    첫번째는 철수가 영희와 놀다가 수시로 시간을 확인한 것이고,
    두번째는 오후1시로 알람을 맞추고 영희와 논것입니다. 

    마찬가지로 차가 고장나서 카센터에 수리를 맡기고 수시로 수리가 완료되었는지 카센터에 전화를 해서 물어보는것보다
    카센터에 자신의 전화번호를 알려주고 수리가 완료되면 알려달라고 하는것이 카센터쪽이나 수리를 맡긴사람이나 양쪽모두에게 편할 것입니다.

    위의 두 예처럼 어떤 정보를 원하는 쪽이 정보를 제공하는 쪽에게 반복적으로 정보를 요구(또는 확인)하는 방법보다
    정보를 제공하는 쪽이 정보를 원하는 쪽에게 통보하는 것이 효율적일 것입니다.

    이런 상황에서 사용하면 좋은 것이 callback함수라고 보시면 됩니다.



    아래 소스는 콜백함수를 사용한 예제로
    단순한 시계클래스인 Clock클래스에 void타입의 콜백함수 타입을 만들어 놨습니다.
    그리고 Clock를 사용하는 쪽에서 void타입의 콜백함수(OnAlarm)함수를 만든후 해당 함수를 Clock객체에 콜백함수로 설정하였습니다.

    Clock클래스에서는 1분단위로 콜백함수를 호출하도록 설정하였습니다.

    코드의 전체적인 내용은 Clock시계를 켜놓은후에 1분후에 알람이 울리도록하고 알람이 울리면 일어나서 출근한다는 내용입니다.


    TestCallback.zip


    /* Clock.h */
    #include <TIME.H>
    typedef void (*pfCallback)();
    class CClock
    {
    public:
         pfCallback m_cb;  // 콜백함수
         struct tm now;      // 현재시간
         int bStop;            // 시계를 멈출것인가?
         CClock(void);
         ~CClock(void);
         void Start(void);
         void Stop(void);
         void SetCallbackFunction(pfCallback cbFunc);
    };
    

    /* Clock.cpp */
    #include "Clock.h"
    #include <PROCESS.H> 
    #include <WINDOWS.H>
    #include <STDIO.H>
    
    
    void OnTimer(void* vp);
    
    CClock::CClock(void)
    {
         bStop = TRUE;
         m_cb = NULL;
    }
    
    CClock::~CClock(void){}
    
    void CClock::Start(void)
    {
         // 시계스레드 시작
         _beginthread(OnTimer,0,this);
    }
    
    void CClock::Stop(void){    bStop = TRUE;  }
    
    
    void CClock::SetCallbackFunction(pfCallback cbFunc){    m_cb = cbFunc;  }
    
    
    void OnTimer(void* vp)
    {
         time_t t;
         CClock* p = (CClock*)vp;
         // 시계를 멈추기전까지 계속 현재시간을 구한다.
         while(p->bStop!=FALSE)
         {
              Sleep(1000);
              t = time(NULL);
              p->now = *localtime(&t);
              // 매1분마다 콜백함수호출
              if(p->now.tm_sec == 0 )
              {
                   if(p->m_cb) p->m_cb();
              }
         }
    }
    

    /* main.cpp */
    #include "Clock.h"
    #include <STDIO.H>
    #include <WINDOWS.H>
    
    // 콜백함수
    void OnAlarm();
    int isSleeping;
    int main(int argc, char* argv[])
    {
         CClock clock;
         clock.Start();
         // OnAlarm함수를 콜백함수로 설정
         clock.SetCallbackFunction(OnAlarm);
         isSleeping = 1;
         printf("zzz...\n");
         
         while(isSleeping)
         {
              Sleep(1000);
         }
     
         clock.Stop();
         printf("go to work...\n");
         Sleep(1000);
         return 0;
    }
    
    void OnAlarm()
    {
         printf("wake up!!!\n");
         isSleeping = 0;
    }
    

Designed by Tistory.