C中的循环/计时器

时间:2011-04-04 14:50:59

标签: c linux loops timer

如何在C中创建计时器?

我想要一段代码来连续从gps解析器输出中获取数据。

是否有适合自己的图书馆,还是应该自行编写?

7 个答案:

答案 0 :(得分:15)

最简单的方法:

#include <pthread.h>

void *do_smth_periodically(void *data)
{
  int interval = *(int *)data;
  for (;;) {
    do_smth();
    usleep(interval);
  }
}

int main()
{
  pthread_t thread;
  int interval = 5000;

  pthread_create(&thread, NULL, do_smth_periodically, &interval)

  ...
}

答案 1 :(得分:6)

在POSIX系统上,您可以创建(并捕获)alarm。报警很简单,但会在几秒钟内完成。如果您需要比秒更精细的分辨率,请使用setitimer

struct itimerval tv;
tv.it_interval.tv_sec = 0;
tv.it_interval.tv_usec = 100000;  // when timer expires, reset to 100ms
tv.it_value.tv_sec = 0;
tv.it_value.tv_usec = 100000;   // 100 ms == 100000 us
setitimer(ITIMER_REAL, &tv, NULL);

通过设置sigaction定期捕捉定时器。

答案 2 :(得分:4)

一个人不“在C中创建一个计时器”。 C标准中没有关于计时或调度的任何内容,因此如何实现这一点取决于操作系统。

对于C菜鸟来说,这可能是一个合理的问题,因为许多语言支持这样的事情。 Ada确实如此,我相信下一版本的C ++可能会这样做(Boost现在支持它)。我很确定Java也能做到。

在linux上,最好的方法可能就是使用pthread。特别是,您需要调用pthread_create()并将其传递给您的例程地址,该地址可能包含一个在底部带有sleep()(或usleep())调用的循环。

请注意,如果你想做一些近似于实时调度的事情,那么仅仅做一个愚蠢的usleep()是不够好的,因为它不会考虑循环本身的执行时间。对于这些应用程序,您需要设置periodic timer并等待它。

答案 3 :(得分:1)

SDL在C中提供跨平台计时器。

http://www.libsdl.org/cgi/docwiki.cgi/SDL_AddTimer

答案 4 :(得分:0)

如果您使用的是Windows,则可以使用SetTimer,否则您可以使用timeGetTime_beginthreadex以及带回调的计时器队列构建计时器

答案 5 :(得分:0)

关于计时器的问题非常不明确,尽管有两个功能可以帮助您:

  • sleep()此函数将导致执行停止指定的秒数。如果您想更准确地指定睡眠时间,也可以使用usleep和nanosleep
  • gettimeofday()使用此功能,您可以在时间步之间停止。

有关进一步说明,请参阅联机帮助页:)

答案 6 :(得分:0)

如果gps数据来自某个硬件设备,比如通过串口,那么你可以考虑的一件事是改变架构,以便解析器启动你试图运行的代码,当更多的数据是可用。

它可以通过回调函数执行此操作,也可以发送事件 - 实际实现将取决于您可用的内容。