2009-09-17 100 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的::(),...