如何在C中创建计时器?
我想要一段代码来连续从gps解析器输出中获取数据。
是否有适合自己的图书馆,还是应该自行编写?
答案 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)
答案 4 :(得分:0)
如果您使用的是Windows,则可以使用SetTimer
,否则您可以使用timeGetTime
和_beginthreadex
以及带回调的计时器队列构建计时器
答案 5 :(得分:0)
关于计时器的问题非常不明确,尽管有两个功能可以帮助您:
有关进一步说明,请参阅联机帮助页:)
答案 6 :(得分:0)
如果gps数据来自某个硬件设备,比如通过串口,那么你可以考虑的一件事是改变架构,以便解析器启动你试图运行的代码,当更多的数据是可用。
它可以通过回调函数执行此操作,也可以发送事件 - 实际实现将取决于您可用的内容。