Код для запуска большого таймера обратного отсчета
Я хочу написать программу для запуска таймера обратного отсчета с начальным значением, скажем, 7 лет. Компьютер может перезагрузиться между ними. Я могу думать о файловом подходе:
open file
if file_empty write initval = 7 years
while cpu_on
write timestamp to file
sleep for 1 sec
Тем не менее, как я могу найти время между перезагрузками? Точность в течение 1 секунды мне подходит. Предположим, код предназначен для автономной системы, скажем, космического корабля, который находится в спящем режиме в течение длительного периода времени без постоянного подключения к сети.
2 ответа
Кажется, гораздо проще просто узнать текущее системное время и вычислить значение таймера обратного отсчета в обратном направлении.
Например, скажем, вы хотите считать до 2021-05-09. Значение таймера всегда будет разницей между этим временем и текущим временем. По мере увеличения текущего времени таймер будет уменьшаться.
Это будет точно, пока системные часы точны, что, скорее всего, будет в современной системе, подключенной к сети. Для сохранения состояния не нужны файлы, которые кажутся очень хрупкими и громоздкими. Если нет другого способа узнать текущее время в реальном времени, вы не сможете справиться с перезагрузками. Проверьте, есть ли на платформе таймер с батарейным питанием, который выдерживает основные перезагрузки ЦП, что довольно часто встречается во встроенных системах (и старых ПК).
Как насчет:
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;
}