回答
看看SetTimer函數。
UINT_PTR timerid = SetTimer(NULL, 0, milliseconds, &callback);
定時器不是C語言的一部分。
您應該查看所使用的編程環境的文檔,以瞭解如何執行定時器。由於您未指明什麼環境,因此無法回答您的問題。
平臺爲Windows。 – Vidya 2009-09-17 11:58:14
如果您願意處理WIN32 Thread Pools,則可以使用線程池定時器。
線程池是工作線程的集合,可以代表應用程序高效地執行異步回調。線程池主要用於減少應用程序線程的數量並提供對工作線程的管理。應用程序可以排隊工作項目,將工作與可等待的句柄相關聯,根據計時器自動排隊,並與I/O綁定。
此API的一部分,見
CreateTimerQueueTimer
Function創建一個定時器隊列定時器。此計時器在指定的到期時間到期,然後在每個指定的時間段後到期。當定時器到期時,調用回調函數。
如果您不需要在應用程序中做其他任何事情,則可以使用sleep()函數。它會停止繼續執行,然後在指定的持續時間到期後繼續執行代碼(ish)。
在Windows中,如果您想要睡眠的時間間隔小於一秒,我們曾使用多媒體計時器功能。其他一些方法是平臺相關的。
我也聽說過使用'select()'作爲毫秒/微秒睡眠方法的人。
如果你需要其他的事情發生,你正在尋找在第二個線程使用睡眠/選擇。
這是Google Library for doing high resolution timing以及。它可能有幫助。
+1,因爲我喜歡谷歌的參考。 – 2010-01-08 09:45:59
你可以做到這一點的一種方法是調用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時在第二個參數中傳遞的計時器標識符。
你不需要一個窗口,你只需要一個消息循環 – 2011-02-20 10:23:38
可能有點偏離目標,它的C++不直C,但這裏是我的Windows計時器隊列的實現,包含測試和TDD評論。請注意,本系列的第一部分解釋了爲什麼我決定推出自己的產品,而不是使用其他產品。
http://www.lenholgate.com/blog/2004/05/practical-testing.html
/* ** 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的::(),...
- 1. 如何在c中實現一個計時器?
- 2. 如何在Android中實現兩個倒計時定時器
- 3. 如何在asp.net c#中實現計時器?
- 4. 試圖在DOM中實現一個倒數計時器
- 5. 如何在iphone中實現計步器?
- 6. 如何在C++中實現一個類似SQL的容器
- 7. 如何實現心跳計時器
- 8. 如何實現倒數計時器
- 9. 如何在C/C++中實現定時器
- 10. 如何在MVC中的web.config中實現會話計時器?
- 11. 在C++中如何臨時實現?
- 12. 如何設計和實現一個wiki?
- 13. 在Linux中使用C++實現低開銷間隔計時器
- 14. 如何在objective-c中實現/計算這個函數?
- 15. 如何在TDD中實現倒數計時器類?
- 16. 我該如何在軌道中實現倒數計時器?
- 17. 如何在java中實現多線程計時器任務?
- 18. 如何在ASP.NET頁面中實現倒數計時器?
- 19. 如何在android中實現問答遊戲的計時器
- 20. 如何在擺動中實現倒數計時器
- 21. 如何在Xamarin.forms中實現定時器
- 22. 倒計時計時器在UILabel中的實現?
- 23. 如何使計時器在Python中實時計時?
- 24. 如何在c#中暫停計時器?
- 25. 如何在C#中設置計時器?
- 26. 如何在C#中創建計時器?
- 27. 如何在C#中實現與定時器的同步
- 28. 如何在django模板中實現一個運行總計?
- 29. 我將如何實現一個計數器
- 30. 如何實現一個用於標量計的發生器
...如果它是一個窗口化的Win32 C應用程序。 – Kieveli 2009-09-17 12:15:11
是的,它必須有一個消息循環。不過,它不需要任何窗口。 – avakar 2009-09-17 12:21:06
@avakar所以如果發生某些事件,我需要重置計時器。我怎麼能做到這一點? – Sorcrer 2016-04-11 16:50:11