2009-04-12 5 views
0

Ich habe ein Programm, das time() und localtime() verwendet, um eine interne Uhr zu setzen, aber dies muss geändert werden, so dass die interne Uhr unabhängig ist Benutzer und die "echte" Zeit. Ich muss in der Lage sein, eine vernünftige Startzeit einzustellen und sie vorwärts zählen zu lassen, abhängig von einem internen Timer des Programms. Irgendwelche Ideen über den besten Weg, dies zu erreichen? Hier ist der Auszug:Ersetzen von time() und localtime() durch benutzerunabhängige Äquivalente

#define ConvertToBCD(x) ((x/10) << 4) | (x % 10); 
time_t tm; 
time(&tm); 
struct tm *tm_local= localtime(&tm); 
tm_local->tm_year %= 100; 
tm_local->tm_mon++; 
timedata[0] = ConvertToBCD(tm_local->tm_year); 
timedata[1] = ConvertToBCD(tm_local->tm_mon); 
timedata[2] = ConvertToBCD(tm_local->tm_mday); 
timedata[3] = (tm_local->tm_wday + 6) & 7; 
if (!(TimeStatus & 0x02)) tm_local->tm_hour %= 12; 
timedata[4] = ((tm_local->tm_hour < 12) ? 0x00 : 0x40) | ConvertToBCD(tm_local->tm_hour); 
timedata[5] = ConvertToBCD(tm_local->tm_min); 
timedata[6] = ConvertToBCD(tm_local->tm_sec); 

Antwort

1

A time_t unter POSIX complient Systemen ist nur die Anzahl der Sekunden seit der Epoche , 1. Januar 1970 00.00.00.

Fügen Sie einfach einen (möglicherweise negativen) Wert zu einem time_t hinzu, um die Zeit zu ändern, stellen Sie sicher, dass der Wert nicht überläuft, und verwenden Sie dann wie üblich localtime.

+0

Ich stimme zu, speichern Sie Ihre interne Zeit als Offset zur Epoche Zeit. –

0

Wenn Sie nur die ganze zweite Auflösung benötigen, kann time() verwendet werden; Wenn Sie eine Auflösung unter einer Sekunde benötigen, verwenden Sie gettimeofday(). Wenn Sie jedoch die zurückgegebenen Werte steuern möchten, müssen Sie sich einen Ersatz für time() (oder gettimeofday()) definieren. Die meisten Bibliotheken entsprechen den in Plaugers The Standard C Library beschriebenen Richtlinien. Sie können häufig eine Funktion namens time() bereitstellen, die sich wie gewünscht verhält und die Standardversion ersetzt. Alternativ und sicherer können Sie Ihren Code überarbeiten, um eine Funktion Ihrer eigenen Entwicklung aufzurufen, vielleicht simulated_time() genannt, wo Sie für die Produktionsarbeit simulated_time() die echte time() nennen können (möglicherweise über eine Inline-Funktion in C99 und C++) kann Ihre eigene Version sein, die die Zeit so einstellt, wie Sie sie brauchen.

Sie müssen Ihre Verwendung von localtime() nicht ändern; Es konvertiert einfach was auch immer time_t Wert Sie geben es in eine struct tm; Sie möchten, dass es wie immer Antworten gibt.

0

Die Art, wie ich es verstehe, ist, dass Sie eine interne Uhr wollen, die entsprechend dem Fortschritt der realen Uhr aktualisiert wird.

Also dann würden Sie so etwas wie dies erstellen:

struct myTime 
{ 
    time_t userStart; 
    time_t systemStart; 
    time_t curTime; 
}; 

void initTtime(struct myTime *t, time_t time) 
{ 
    t->userStart=time; 
    t->systemStart=time(NULL); 
} 

time_t getTime(struct myTime *t) 
{ 
    t->curTime = t->userStart + time(NULL)-t->systemStart; 
    return t->curTime; 
} 

so INITTIME verwenden stellen Sie die aktuelle Zeit, die Sie haben wollen, dies zu diesem Zeitpunkt auf die Systemzeit verknüpft wird. Wenn Sie getTime mit dieser Struktur aufrufen, wird der Startpunkt mit der fortschreitenden Zeit aktualisiert. (Hinweis, ich habe den Code nicht getestet und Sie können die Struktur entweder direkt verwenden, wenn Sie möchten).

Für die Genauigkeit im Sekundentakt ersetzen Sie time() und time_t durch das äquivalent gettimeofday. Und für die Umwandlung, Ascii Arting, Breakdown zu etwas anderem als einem zweiten Zähler können Sie immer noch die Unix-Funktion verwenden.