Код для запуска большого таймера обратного отсчета

Я хочу написать программу для запуска таймера обратного отсчета с начальным значением, скажем, 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;
}
Другие вопросы по тегам