2009-09-17 98 views

回答

7

看看SetTimer函數。

UINT_PTR timerid = SetTimer(NULL, 0, milliseconds, &callback); 
+0

...如果它是一個窗口化的Win32 C應用程序。 – Kieveli 2009-09-17 12:15:11

+4

是的,它必須有一個消息循環。不過,它不需要任何窗口。 – avakar 2009-09-17 12:21:06

+0

@avakar所以如果發生某些事件,我需要重置計時器。我怎麼能做到這一點? – Sorcrer 2016-04-11 16:50:11

0

定時器不是C語言的一部分。

您應該查看所使用的編程環境的文檔,以瞭解如何執行定時器。由於您未指明什麼環境,因此無法回答您的問題。

+1

平臺爲Windows。 – Vidya 2009-09-17 11:58:14

0

如果您願意處理WIN32 Thread Pools,則可以使用線程池定時器。

線程池是工作線程的集合,可以代表應用程序高效地執行異步回調。線程池主要用於減少應用程序線程的數量並提供對工作線程的管理。應用程序可以排隊工作項目,將工作與可等待的句柄相關聯,根據計時器自動排隊,並與I/O綁定。

此API的一部分,見

CreateTimerQueueTimer Function

創建一個定時器隊列定時器。此計時器在指定的到期時間到期,然後在每個指定的時間段後到期。當定時器到期時,調用回調函數。

0

如果您不需要在應用程序中做其他任何事情,則可以使用sleep()函數。它會停止繼續執行,然後在指定的持續時間到期後繼續執行代碼(ish)。

在Windows中,如果您想要睡眠的時間間隔小於一秒,我們曾使用多媒體計時器功能。其他一些方法是平臺相關的。

我也聽說過使用'select()'作爲毫秒/微秒睡眠方法的人。

如果你需要其他的事情發生,你正在尋找在第二個線程使用睡眠/選擇。

這是Google Library for doing high resolution timing以及。它可能有幫助。

+0

+1,因爲我喜歡谷歌的參考。 – 2010-01-08 09:45:59

0

你可以做到這一點的一種方法是調用SetTimer,然後處理WndProc中的WM_TIMER事件。例如,這將設置是得到一個計時器稱爲每45秒,並顯示當它被稱爲一個消息框:

 
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch(message) 
    { 
     case WM_CREATE: 
      SetTimer(hwnd, 1, 45000, NULL); 
      break; 

     case WM_TIMER: 
      MessageBox(hwnd, L"Timer", L"Timer fired!", MB_OK); 
      break; 
    } 
    return DefWindowProc(hwnd, message, wParam, lParam); 
} 

到SetTimer的第一個參數是要收到WM_TIMER消息的窗口 - 你可能希望這是你的窗口,所以你可以通過窗口傳遞給你的HWND。

第二個參數是一個可用於唯一標識計時器的編號。您可以一次運行多個計時器,並且需要一種方法來確定哪一個計時器已啓動。

第三個參數是您希望計時器在觸發之前等待多長時間。它以毫秒爲單位,所以如果你想要秒數,你必須多達一千。

如果你想通過查看WM_TIMER來處理定時器,那麼第四個參數是NULL。否則,您可以將指針傳遞給將被調用的回調函數。請記住,計時器每隔X毫秒就會持續發射,直到你殺死它爲止。您可以通過調用KillTimer並傳入與調用SetTimer時傳遞給第二個參數相同的數字來殺死它。

另外,當Windows向您發送WM_TIMER消息時,wParam將包含您在調用SetTimer時在第二個參數中傳遞的計時器標識符。

+0

你不需要一個窗口,你只需要一個消息循環 – 2011-02-20 10:23:38

0

可能有點偏離目標,它的C++不直C,但這裏是我的Windows計時器隊列的實現,包含測試和TDD評論。請注意,本系列的第一部分解釋了爲什麼我決定推出自己的產品,而不是使用其他產品。

http://www.lenholgate.com/blog/2004/05/practical-testing.html

1

Timers and default actions

/* ** TIMEGETC.C - waits for a given number of seconds for the user to press ** a key.  Returns the key pressed, or EOF if time expires ** ** by Bob Jarvis */ 

#include <stdio.h> 
#include <time.h> 
#include <conio.h> 

int timed_getch(int n_seconds) 
{ 
    time_t start, now; 

    start = time(NULL); now = start; 

    while(difftime(now, start) < (double)n_seconds && !kbhit()) { now = time(NULL); } 

    if(kbhit()) 
     return getch(); 
    else 
     return EOF; 
} 

void main(void) 
{ 
    int c; 

    printf("Starting a 5 second delay...\n"); 

    c = timed_getch(5); 

    if(c == EOF) 
     printf("Timer expired\n"); 
    else 
     printf("Key was pressed, c = '%c'\n", c); 
} 

但正如上面提到的我會考慮使用Windows的SetTimer的::(),...