2012-07-14 2 views
0

리소스 ID가 추가되고 WM_TIMER 메시지를 기반으로 타이머를 사용하고 있습니다. OnTimer()DrunkenDragon()과 같은 루틴을 호출하고 싶지만 SetTimer(id,10sec,NULL)을 호출 한 후에는 한 번만 호출하면됩니다. 우리는 KillTimer()DrunkenDragon() 루틴을 호출하면 해결할 수 있음을 알고 있습니다. 이걸로가는 것도 괜찮습니까? 아니면 타이머가있는 뭔가를 놓치고 있습니까?WM_TIMER 메시지를 한 번만 생성하는 setTimer()

+0

왜 resource-id입니까? 카운터 변수를 사용하여 타이머가 처음 실행되는지 여부를 확인할 수 있습니다. – Ajay

답변

0
int CYourDialog::OnInitDialog() 
{ 
    __super::OnInitDialog(); 

    SetTimer(0x10, 10000, NULL); 

    return true; 
} 

void CYourDialog::OnTimer(UINT_PTR ignore) 
{ 
    DrunkenDragon(); 
} 

메시지 맵에 ON_WM_TIMER이 있는지 확인하십시오.

0

WM_TIMER 메시지의 생성을 중지하기 위해 시스템에 KillTimer를 사용해야 할 필요가 있습니다.

CreateTimerQueueTimer를 사용하고 매개 변수를 콜백이 한 번만 호출되는 방식으로 설정할 수도 있습니다. WindowClass.h에서

그래서,

See this for more details.

0

(내가 한 가능한 답변에 만족처럼 만 경우 다른 사람이 대답이 건너 온다), 당신이 할 수있는 일은을 열거 사용할 타이머 식별자 원시 숫자 값을 사용할 수는 있지만 기호를 사용하면 장기적으로 더 쉽게 작업 할 수 있습니다.

class WindowClass : CWnd 
{ 
    // other parts of the interface... 

protected: 

    enum 
    { 
     TIMER_MAIN_UPDATE = 1, 
     TIMER_PLASTERED_DRAGON 
    }; 
}; 

한편, 다시하지만 당신이 창을 만든 것 후 10 초 수행 할 경우에만 어떤 좋은

int WindowClass::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
    // { ... other initialization code } 

    // In case you want to do other types of updates at regular intervals. 
    SetTimer(TIMER_MAIN_UPDATE, 1000, NULL); 

    // Note the symbolic identifiers. 
    SetTimer(TIMER_PLASTERED_DRAGON, 10000, NULL); 

    return 0; 
} 

, WindowClass.cpp에서에서.

void WindowClass::OnJustGotPaid() 
{ 
    // { ... other handling } 

    // Since our dragon is a real lightweight, it apparently only takes 
    // 10 seconds to get him puking up flaming vomit. 
    SetTimer(TIMER_PLASTERED_DRAGON, 10000, NULL); 
} 

을가 실제 이벤트, 그것은 일반적으로 윈도우 OnTimer() 콜백에서 처리됩니다 처리 할 시간이 올 때 : 당신이 원하는 때마다 당신은 또한 그냥 다른 이벤트 처리기에서 SetTimer()를 호출 할 수 있습니다. 원할 경우 NULL 대신 SetTimer()의 세 번째 매개 변수에 유효한 함수 포인터를 지정하여 타이머 이벤트를 다른 (사용자 정의) 콜백으로 보낼 수 있습니다.

void WindowClass::OnTimer(UINT_PTR p_timer_id) 
{ 
    switch(p_timer_id) 
    { 

    default: 
     break; 

    case TIMER_MAIN_UPDATE: 

     // { ... main update code } 
     break; 

    case TIMER_PLASTERED_DRAGON: 

     // Killing the timer first in case DrunkenDragon() takes a good 
     // long while for whatever reason. 
     KillTimer(TIMER_PLASTERED_DRAGON); 

     DrunkenDragon(); 

     break; 
    } 
} 
관련 문제