我想编写一个程序来运行一个倒数计时器,其初始起始值为7年。计算机可以重新启动。我可以想到基于文件的方法:
open file
if file_empty write initval = 7 years
while cpu_on
write timestamp to file
sleep for 1 sec
但是,如何找到重新启动之间经过的时间? 1秒内的准确度对我来说没问题。假设代码用于独立系统,例如,在没有永久网络连接的情况下长时间休眠的航天器。
答案 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;
}