用于运行大型倒计时器的代码

时间:2014-11-25 10:04:30

标签: c linux algorithm timer pseudocode

我想编写一个程序来运行一个倒数计时器,其初始起始值为7年。计算机可以重新启动。我可以想到基于文件的方法:

open file
        if file_empty write initval = 7 years
while cpu_on
        write timestamp to file
        sleep for 1 sec

但是,如何找到重新启动之间经过的时间? 1秒内的准确度对我来说没问题。假设代码用于独立系统,例如,在没有永久网络连接的情况下长时间休眠的航天器。

2 个答案:

答案 0 :(得分:3)

找出当前的系统时间似乎更容易,并从那里向后计算倒数计时器的值。

例如,假设你要倒数到2021-05-09。然后,计时器的值始终是该时间与当前时间之间的差值。随着当前时间的增加,计时器将会减少。

只要系统时钟准确,这将是准确的,而这很可能是在现代的网络连接系统上。它不依赖文件来保持状态,这似乎非常脆弱和繁琐。如果没有其他方法可以找出当前的实际时间,那么您无法处理重新启动。检查平台是否有某种形式的电池备份计时器,可以在主CPU重启后继续存在,这在嵌入式系统(和旧PC)中很常见。

答案 1 :(得分:-1)

怎么样:

on computer start if file does not exist create it and write using binary time_t integer representing now.

while cpu is on, every second check whether now - stored time >= 7 years and if so do whatever you want - eg buzzing sound.

你需要每秒继续运行,但可以让你开始。

#include <time.h>
#include <stdio.h>

// 7*52*7*24*60*60
#define TIMEDIFF 220147200

int main(int argc, char* argv[]) {

   FILE* fp = fopen(argv[1], "r");
   if(!fp) {
      fp = fopen(argv[1], "w");
      time_t starttime = time(NULL);
      fwrite(&starttime, sizeof(time_t), 1, fp);
      printf("time_t value when set now: %u\n", starttime);
   }
   else {
       time_t timethen;
       size_t bytes = fread(&timethen, sizeof(time_t), 1, fp);
       printf("time_t value when set: %u\n", timethen);

       time_t testnow = time(NULL);
       if(difftime(timethen, testnow) > TIMEDIFF)
          printf("Your 7 years is up!");
   }

   fclose(fp);
   return 0;
}