如何在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中提供了一个跨平台计时器
如果你使用Windows,你可以使用SetTimer
,否则你可以建立一个计时器timeGetTime
和_beginthreadex
以及一个带有回调的定时器队列
关于一个计时器的问题是相当不确定的,虽然有两个功能,我脑海中会帮助你:
查看manpages进一步的解释:)
如果gps数据来自某个硬件设备,比如通过串口,那么你可能会考虑改变体系结构,以便在有更多数据可用的时候,解析器就会启动你试图运行的代码。
它可以通过回调函数来实现,也可以发送一个事件 – 实际的实现将取决于你有什么可用的。