回答
看看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