2013-03-14 16 views
1

我有下面的程序。我想知道setTimer是如何工作的。所以,我寫了一個程序,但無法理解爲什麼TimerProc函數沒有被調用。爲什麼?還需要做些什麼才能觸發setTimer/TimerProc。請幫忙。爲什麼setTimer不起作用?

#include <windows.h> 
#include <stdio.h> 

VOID CALLBACK TimerProc(
    HWND hwnd, // handle of window for timer messages 
    UINT uMsg, // WM_TIMER message 
    UINT idEvent, // timer identifier 
    DWORD dwTime // current system time 
    ) { 
     printf("from callback\n"); 

    } 
int main(int argc, char *argv[]) 
{ 
    UINT timerid = SetTimer(NULL,1,1000,TimerProc);/*changed the time from 1 to 1000, but no effect*/ 
    printf("timerid %d\n",timerid); 
    int i,j; 

     //delay loop, waiting for the callback function to be called 
    for(j=0;j<0xffffffff;j++); 
    /*{ 
    printf("%d\n", j); 
    }*/ 

    printf("done \n"); 
    system("PAUSE"); 
    return 0; 
} 
+0

如果其中一個答案沒問題,你能接受嗎? (當然,我希望這將是我的答案!) – 2013-03-14 13:44:47

回答

3

的SetTimer文件說: *當指定的TimerProc回調函數,默認的窗口過程調用回調函數,當它處理WM_TIMER。因此,你需要在調用線程發送消息,即使您使用的,而不是處理WM_TIMER的TimerProc *

相反,你需要延遲循環是這樣的:。

bool bStillBusy = false; 


int main() 
{ 

MSG msg; 

bStillBusy = true; 

id = SetTimer(NULL, 0, 3000, (TIMERPROC) TimerProc); 

while(bStillBusy) 
{ 
    GetMessage(&msg, NULL, 0, 0); 
    DispatchMessage(&msg); 
} 
... 
etc. 
} 

您的bStillBusy設置爲「假'在回調中。

+0

你的答案確實有效。但是在這裏我想知道當我們使用GetMessage和DispatchMessage時究竟發生了什麼? – 2013-03-14 10:31:25

+0

@RasmiRanjanNayak,當計時器到期時,它發送WM_TIMER消息,當WM_TIMER消息被調度到默認的窗口過程時,該窗口過程又調用您在SetTimer上定義的回調。 – user1514631 2013-03-14 10:55:18

+0

我們可以在不使用Getmessage和Dispatchmessage的情況下做同樣的事嗎? – 2013-03-14 13:54:33

3

定時器通過Windows消息隊列工作,並且您有一個控制檯應用程序。

如果你創建一個基本的Win32應用程序,所以你得到一個窗口和一個消息循環,當WM_TIMER消息被DefWndProc()調用捕獲時,這就是它將執行回調的地方。當然你也可以自己陷入WM_TIMER。

+0

你的意思是說,而不是控制檯我需要在Visual Studio中選擇'windows應用程序? – 2013-03-14 10:20:50

+0

這是對的,或者看看你問題的評論中的重複問題鏈接。 – 2013-03-14 10:24:39

+0

是的。你可以選擇Win32並自己編寫消息循環。 – 2013-03-14 10:24:40

1

使用正常的Windows事件系統處理計時器,因此您需要一個正常的事件循環。

2

您需要了解消息循環範例。您正在嘗試使用Win32 API而沒有實際執行正確的Win32初始化和操作。

如果你來自Posix,你可以使用SIGALRM和警報。我想你會有更多的工作要做(比如開始一個消息循環,因爲即使你提供了一個回調函數,你仍然需要一個消息循環抽取的方式來調用默認的消息循環處理函數。打電話給你的計時器回調,檢查: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644906(v=vs.85).aspx

應用程序可以通過包括 窗口過程中的WM_TIMER case語句或通過創建定時器時指定的TimerProc回調函數處理WM_TIMER消息 當您指定。 TimerProc回調函數,默認窗口過程調用回調函數 函數處理WM_TIMER時。因此,即使在使用TimerProc而不是處理WM_TIMER時,您也需要在調用線程中調度 中的消息。