2012-05-23 37 views
0

我需要在我的VC++應用程序創建定時器,在這裏我需要設置計時器,並在計時器超時後,我需要調用一個特定的方法...的SetTimer在VC++

我看到MSDN論壇爲和下面的代碼做這樣做 SetTimer(NULL,1,5*1000,TimerProc);

和我TimerProc方法如下

void CALLBACK TimerProc(HWND aHwnd, UINT aMessage, UINT_PTR aTimerId, DWORD aTime) 
{ 
    StopProceess(); 
} 

我5秒鐘後SetTimer承擔應該調用TimerProc方法,但我從來沒有打過電話不知道我在這做錯了什麼。或PLZ建議是否有其他選擇。

謝謝。

+0

你在哪裏調用SetTimer,爲什麼窗口句柄爲NULL?這是一個MFC應用程序 – Jeeva

回答

0

使用等待定時器。在第5個參數設置的時間後調用回調,並重復每個第6個參數。 時間過去後,回調被調用,執行一些處理,並設置事件允許出口

// ConsoleTimer.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include <Windows.h> 

#define TIME_LAPS 5 * 1000 

HANDLE g_hExitEvent = NULL; 


void CALLBACK WaitOrTimerCallback(PVOID lpParameter, BOOLEAN TimerOrWaitFired) 
{ 
     Sleep(5000); // fake long processing 
     SetEvent(g_hExitEvent); 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
     HANDLE hNewTimer = NULL;                              //call after 
     BOOL IsCreated = CreateTimerQueueTimer(&hNewTimer, NULL, WaitOrTimerCallback, NULL, TIME_LAPS, 
       // repeat 
       TIME_LAPS, WT_EXECUTELONGFUNCTION); 

     g_hExitEvent = CreateEvent(NULL, TRUE, FALSE, NULL); 

     WaitForSingleObject(g_hExitEvent, 15000); 

     DeleteTimerQueueTimer(NULL, hNewTimer, NULL); 

     return 0; 
} 

我不檢查錯誤,你應該。

+0

感謝@JohnCz的回覆...我會試試:) – meghana

0

這個article通過創建和銷燬計時器。

我發現了一些example code,它仍然使用hWnd,有什麼理由不使用hWnd參數嗎?如果你不能使用它,你可以嘗試在NULL傳遞時查看代碼是否工作。我在例子中已經注意到他們將回調撥到TIMERPROC

+0

感謝@Carl的回覆,但他們的所有例子都有關於'Window Handler'的例子,在我的情況下它是空的,其他的都是一樣的。做這個工作?或者是以其他方式這樣做。 – meghana

+0

我之前沒有使用SetTimer函數,所以我不知道這是否可行,但值得一試。編輯答案。 –

1

那麼,它看起來對我好。你有沒有在TimerProc的程序中設置斷點,以及你在哪裏調用SetTimer?你需要確保你確實調用了SetTimer,並且TimerProc並沒有真的被調用。

我會問的下一件事是你是否在消息循環中調度消息?如果你不在消息循環中調度消息,我認爲定時器消息不會被解僱。如果你在你的程序中執行了一些很長的過程,並且你從來沒有用相應的DispatchMessage調用GetMessage/PeakMessage,那麼這可能會導致定時器消息永遠不會被觸發。

+0

感謝@joe Willcoxson爲您重播,是的,您是對的......沒有用於發送消息的消息循環。 – meghana

2

從代碼片段我很肯定你正在編寫基於控制檯的應用程序。

您可以使用其他類型的定時器,或者如果您對精度沒有真正的關注,那麼爲了使此定時器正常工作,您有一件錯過。

即使這是一個控制檯應用程序,您的計時器回調將不會被調用,除非您調度計時器消息。 這樣做:

MSG msg; 
    SetTimer(NULL, 1, 5*1000 ,TimerProc); 

    while (GetMessage(&msg, NULL, WM_NULL, WM_TIMER)) 
    { 
     DispatchMessage(&msg); 
     if (WM_TIMER == msg.message) 
     { 
      break; 
     } 
    } 
    StopProceess(); 

考慮使用Waitable Timer。

+0

感謝@JohnCz的回覆......我把你的建議代碼放在我的應用程序中。但WhileLoop不會等待5秒鐘,因爲我們會在持續時間內立即調用Stop Process。任何想法??而且時間精度對我們來說非常重要,那麼另一個計時器是什麼建議? – meghana

+0

不客氣。如果消息循環沒有等待所請求的時間,則說明有錯誤。 你使用了我的代碼的確切副本嗎? 應用程序應該等待5秒鐘,呼叫定時器程序,並且在執行定時器程序中的任何呼叫之後,它應該退出。 – JohnCz

+0

是的,我已經把確切的代碼。仍然沒有等待:( – meghana