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

时间:2009-09-17 11:54:04

标签: c winapi timer

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

有人可以指导我吗

此致 大额牛

8 个答案:

答案 0 :(得分:8)

查看SetTimer功能。

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

答案 1 :(得分:1)

alarm does这个(在POSIX平台上)。

答案 2 :(得分: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);
}

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

  

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

此API的一部分,请参阅

  

CreateTimerQueueTimer Function

     

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

答案 5 :(得分:0)

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

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

我也听说有人使用'select()'作为一种睡眠方式,持续毫秒/微秒。

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

这里也是Google Library for doing high resolution timing。这可能有所帮助。

答案 6 :(得分: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消息的窗口 - 你可能希望它成为你的窗口,这样你就可以传入windows传递给你的hwnd。

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

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

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

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

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

答案 7 :(得分:0)

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

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

相关问题