如何在Windows上的C中实现计时器

如何在C中创建一个计时器,在时间到期后,我应该可以调用一个回调函数。 平台是窗户。

有人可以指导我

此致,Mithun

看看SetTimer函数。

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

报警 这样做(在POSIX平台上)。

从计时器和默认操作 :

 /* ** 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  #include  #include  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); } 

但我会考虑使用Window的:: SetTimer(),如上所述......

定时器不是C语言的一部分。

您应该查看文档,了解您正在使用的编程环境,以了解如何执行计时器。 由于您没有说明什么环境,因此无法回答您的问题。

如果您愿意处理WIN32 线程池 ,则可以使用线程池计时器。

线程池是工作线程的集合,可以代表应用程序有效地执行异步回调。 线程池主要用于减少应用程序线程的数量并提供工作线程的管理。 应用程序可以对工作项进行排队,将工作与可等待的句柄相关联, 根据计时器自动排队,并与I / O绑定。

这个API的一部分,请参阅

CreateTimerQueueTimer函数

创建一个计时器队列计时器。 此计时器在指定的到期时间到期,然后在每个指定的时间段后到期。 当计时器到期时,将调用回调函数。

如果您不需要在应用程序中执行任何其他操作,则可以使用sleep()函数。 它将停止执行继续,然后在指定的持续时间到期后恢复执行代码(ish)。

在Windows中,如果您想以不到一秒的间隔睡眠,我们以前会使用多媒体计时器function。 其他一些方法依赖于平台。

我也听说过人们使用’select()’作为睡眠方法的毫秒/微秒。

如果您还需要其他事情,那么您希望在第二个线程中使用sleep / select。

这是一个用于执行高分辨率计时的Google库 。 它可能有所帮助。

看一下MAME模拟器实现 。

您可以这样做的一种方法是调用SetTimer,然后在WndProc中处理WM_TIMER事件。 例如,这将设置一个每45秒调用一次的计时器,并在调用时显示一个消息框:

 LRESULT CALLBACK WndProc(HWND hwnd,UINT消息,WPARAM wParam,LPARAM lParam)
 {
    开关(消息)
     {
        案例WM_CREATE:
             SetTimer(hwnd,1,45000,NULL);
            打破;

        案例WM_TIMER:
             MessageBox(hwnd,L“Timer”,L“Timer fired!”,MB_OK);
            打破;
     }
     return DefWindowProc(hwnd,message,wParam,lParam);
 }

SetTimer的第一个参数是你想要接收WM_TIMER消息的窗口 – 你可能希望它成为你的窗口,这样你就可以传入windows传递给你的hwnd。

第二个参数是可用于唯一标识计时器的数字。 你可以一次运行多个计时器,并且需要一种方法来判断哪一个被触发。

第三个参数是您希望计时器在其触发之前等待的时间。 它是以毫秒为单位,因此如果您想要秒数,则必须加倍。

如果要通过查看WM_TIMER来处理计时器,则第四个参数为NULL。 否则,您可以将指针传递给将被调用的回调函数。

请记住,计时器将每隔X毫秒继续发射,直到你杀死它。 您可以通过调用KillTimer并在调用SetTimer时传入传递给第二个参数的相同数字来终止它。

此外,当Windows向您发送WM_TIMER消息时,wParam将包含您在调用SetTimer时在第二个参数中传递的计时器标识符。

可能有点偏离目标,而且它的C ++不是直接C而是这里是我对Windows的计时器队列的实现,包括测试和对TDD的评论。 请注意,该系列的第一部分解释了为什么我决定推出自己的而不是使用替代品。

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