循环/定时器在C

如何在C中创build一个计时器?

我想要一段代码从gpsparsing器输出中连续获取数据。

有没有好的图书馆,还是应该自己写?

最简单的方法:

#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) ... } 

在POSIX系统上,您可以创建(并捕获)一个警报 。 报警很简单,但在几秒钟内设置。 如果你需要比秒更精细的分辨率,然后使用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来定时捕获定时器。

一个不会“在C中创建一个定时器”。 在C标准中没有关于时间和日程安排的内容,所以如何完成这个任务就交给了操作系统。

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

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

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

SDL在C中提供了一个跨平台计时器

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

如果你使用Windows,你可以使用SetTimer ,否则你可以建立一个计时器timeGetTime_beginthreadex以及一个带有回调的定时器队列

关于一个计时器的问题是相当不确定的,虽然有两个功能,我脑海中会帮助你:

  • sleep()该函数将导致执行停止指定的秒数。 如果您想要更精确地指定睡眠时间,也可以使用usleep和nanosleep
  • gettimeofday()使用这个函数你可以停止到时间步长。

查看manpages进一步的解释:)

如果gps数据来自某个硬件设备,比如通过串口,那么你可能会考虑改变体系结构,以便在有更多数据可用的时候,解析器就会启动你试图运行的代码。

它可以通过回调函数来实现,也可以发送一个事件 – 实际的实现将取决于你有什么可用的。