在while循环中每40秒调用一次函数

时间:2016-12-10 04:11:44

标签: c timer

此代码在循环内每40秒调用一次函数。由于time_t是在我的linux系统中签名的,我对这种情况表示怀疑:

if ((time_left <= 0 || time_left > interval))

只检查(time_left <= 0)罚款吗?我提到了一些网站,他们还添加了time_left > interval的支票。需要检查吗?

int print_timed_op()
{
    time_t        time_now;
    time_t        time_left;
    time_t        time_next_interval;
    int           interval = 40, hit_count =10; //40 second interval, 10 times
    time_next_interval = time(0) + interval;

   //tight loop
   while (1) {
         sleep(1);
         time_now = time(0);
         time_left = time_next_interval - time_now;
         /* here time_left > interval check required ? */
         if ((time_left <= 0 || time_left > interval)) { 
              call_my_fuc();
              time_next_interval = time(0) + interval;
              time_left = interval;
              hit_count--;
         }

         if(hit_count <= 0)
            break;
  }
  return 0;
}

注意:我不想使用Linux计时器系统调用或任何其他方法定期调用该函数。

1 个答案:

答案 0 :(得分:2)

检查time_left > interval是为了处理时钟更改或同步。如果您的间隔为40秒,并且有人出现并更新系统时钟以将其向前移动一小时,那么如果您没有进行检查,则会错过90次更新。

您可以使用clock_gettime() CLOCK_MONOTONIC选项以更精确的方式克服此问题。然后时间将永远不会向前或向后跳过,并且您的函数调用将始终均匀分布。