2014-11-25 2 views
0

예를 들어 7 년이라는 초기 시작 값으로 카운트 다운 타이머를 실행하는 프로그램을 작성하고 싶습니다. 컴퓨터를 다시 부팅 할 수 있습니다. 파일 기반 접근 방식을 생각해 볼 수 있습니다.큰 카운트 다운 타이머를 실행하는 코드

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

그러나 재부팅 사이의 경과 시간은 어떻게 확인할 수 있습니까? 1 초 내에 정확도는 괜찮습니다. 코드는 독립형 시스템, 즉 영구 네트워크 연결없이 오랜 기간 동안 최대 절전 모드를 유지하는 우주선을위한 코드라고 가정합니다.

+1

이 모든 언어는 무엇입니까? – bitcell

+0

모든 언어가 유효합니다. 난 의사 코드 나 알고리즘을 원해. –

+1

... 방금 의사 코드를 작성했습니다 : | – bitcell

답변

3

현재 시스템 시간을 알아 내고 카운트 다운 타이머의 값을 거꾸로 계산하는 것이 더 쉬워 보입니다.

예를 들어, 2021-05-09까지 카운트하고 싶다고합시다. 타이머의 값은 항상 그 시간과 현재 시간의 차이가 될 것입니다. 현재 시간이 증가함에 따라 타이머가 감소합니다.

이것은 시스템 시계가 정확하고 최신 네트워크 연결 시스템에있을 가능성이 높기 때문에 정확합니다. 상태를 유지하기 위해 파일에 의존하지는 않습니다. 매우 취 약하고 복잡합니다. 현재 실제 시간을 알아낼 다른 방법이 없다면 재부팅을 처리 할 수 ​​없습니다. 플랫폼에 내장 된 시스템 (및 구형 PC)에서 흔히 볼 수있는 메인 CPU 재부팅을 견디는 몇 가지 형태의 배터리 지원 타이머가 있는지 확인하십시오.

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. 

당신이 두 번째이 모든을 계속 실행해야합니다,하지만 당신은 시작 얻을 수 :에 대해 어떻게

+0

이것은 독립 실행 형 시스템, 예를 들어 네트워크 연결없이 긴 시간 동안 최대 절전 모드를 유지하는 우주선을위한 것입니다. –

+1

@ Manav : 시스템에 신뢰할 수 있고 영구적 인 시스템 클럭 (7 년 만에 2 초보다 정확하며 표준 쿼츠보다 훨씬 뛰어남)이 없으면 그냥 잊어 버리십시오. 컴퓨터는 최대 절전 모드 상태를 추측 할 수 없습니다. –

-1

.

#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; 
} 
+0

코드가 기본 요구 사항을 처리하지 못한다면 재부팅하라! –

+0

매 초마다이 프로그램을 실행하면 –

관련 문제