如何定期自动调用函数?

时间:2014-02-25 03:10:32

标签: c cygwin

您好我正在编写一个C程序来连接一个定期提供数据的串行设备,我需要定期查看串口的输入。这可以通过'读'功能来完成。但我不知道如何经常以固定的时间间隔来呼叫它?

2 个答案:

答案 0 :(得分:1)

这种行为使大多数操作系统内置的可爱机器短路,这样做就像cron这样的东西似乎是一个可爱的选择。失败了所有这些(如果你只是在寻找一个快速的hacky选项)忙碌的等待并不是超级棒,系统不够明亮,无法绕过那个,所以你的程序最终吃掉了一个没有做任何事情的核心。你的节目,所以虽然它主要是品味问题,但我自己也是一个纳米睡眠的人。 在nix / nux系统上:

    #include <time.h>

    int main(void)
    {
       struct timespec sleepytime;
       sleepytime.tv_sec = seconds_you_want_to_sleep
       sleepytime.tv_nsec = nanoseconds_you_want_to_sleep
       while( !done)
       {
          nanosleep(&sleepytime, NULL); 
          //do your stuff here
       }
       return 0;
    } 

如果您担心中断,第二个参数应该是另一个timespec结构,其中将存储剩余的时间量,检查是否== 0, 然后继续卡车运输。

在Windows中,显然它更容易一些。

    #include <windows.h>

    int main(void)
    {
       while( !done)
       {
          Sleep(milliseconds_you_want_to_sleep); 
          //do your stuff here
       }
       return 0;
    } 

不幸的是我没有运行Windows,所以我无法测试第二个代码示例。

答案 1 :(得分:0)

如果你真的需要定期阅读(而不只是轮询数据可用),你可以这样做:

#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>

void timer_handler (int signum)
{
 static int count = 0;
 printf ("timer expired %d times\n", ++count);
}

int main ()
{
 struct sigaction sa;
 struct itimerval timer;

 /* Install timer_handler as the signal handler for SIGVTALRM. */
 memset (&sa, 0, sizeof (sa));
 sa.sa_handler = &timer_handler;
 sigaction (SIGVTALRM, &sa, NULL);

 /* Configure the timer to expire after 250 msec... */
 timer.it_value.tv_sec = 0;
 timer.it_value.tv_usec = 250000;
 /* ... and every 250 msec after that. */
 timer.it_interval.tv_sec = 0;
 timer.it_interval.tv_usec = 250000;
 /* Start a virtual timer. It counts down whenever this process is
   executing. */
 setitimer (ITIMER_REAL, &timer, NULL);

 /* Do busy work. */
 while (1);
}

我从http://www.informit.com/articles/article.aspx?p=23618&seqNum=14复制了这个并改变了计时器类型,实际上你设置了一个间隔计时器并在计时器用完时处理信号。