2011-07-20 39 views
2

我的問題是正常的MFC SetTimer的,如下如何在我的mfc應用程序中的非對話框.cpp中使用SetTimer?

void CTimersDlg::OnButtonBegin() 
{ 
    // create the timer 

    SetTimer(m_nTimerID, uElapse, NULL); 
} 

void CTimersDlg::OnButtonStop() 
{ 
    // destroy the timer 
     KillTimer(m_nTimerID); 
} 

void CTimersDlg::OnTimer(UINT nIDEvent) // called every uElapse milliseconds 
{ 
    // do something, but quickly 
    CDialog::OnTimer(nIDEvent); 
} 

,但如果我需要在我sender.cpp 使用SetTimer的非dialog.cpp,例如如何創建計時器?在SetTimer字段中,處理程序(回調)函數?

回答

2

SetTimer與windows關聯,你需要windows句柄來使用它。對於非窗口類,您應該考慮使用CreateWaitableTimer或使用TimerQueue

+1

SetTimer()不需要窗口。如果傳遞NULL作爲HWND參數,則必須提供指向回調函數的指針以處理計時器通知。您仍然需要在調用線程中分派消息以通過回調接收通知。 –

5

您可以將NULL作爲窗口句柄並在SetTimer調用中包含回調函數。這將允許您接收計時器通知,而無需將其與特定窗口關聯。

如果要將定時器用於單獨的「worker」線程(一個不帶窗口)中,您仍然需要處理消息隊列以接收定時器通知。如果您使用CWinThread對象創建線程,則已在CWinThread::Run的默認實現中爲您處理。

如果您可以更新您的問題,以包含有關sender.cpp內容的更多信息,我可以提供一個更合適的示例。這使用純Windows API創建一個計時器並處理所需的調度隊列。

// Example only. 
VOID CALLBACK timerCallback(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) 
{ 
    printf("Timer called\n"); 
} 

void SomeFunc() 
{ 
    SetTimer(NULL, 1, 1000, timerCallback); 

    MSG msg; 

    // msg-pump 
    while (GetMessage(&msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 
相關問題