2009-04-12 9 views
0

time()とlocaltime()を使用して内部時計を設定するプログラムがありますが、これは内部時計がユーザーと「本物の」時間。私は合理的な開始時間を設定することができる必要があり、それはプログラムの内部のタイマーに依存して前方にカウントする必要があります。これに最も良い方法でアプローチしてください。ここでは抜粋だ:time()とlocaltime()をユーザーから独立した同等物に置き換える

#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); 

答えて

1

time_t、POSIXの準拠のシステムの下で、エポック、1970年1月1日0時00分00秒からの秒数だけです。

time_tに(おそらく負の)値を追加して値をオーバーフローさせないようにしてから、いつものようにlocaltimeを使用してください。

+0

私はエポック時間のオフセットとして内部時間を保存します。 –

0

2番目の解像度全体が必要な場合は、time()を使用できます。秒未満の解像度が必要な場合は、gettimeofday()を使用してください。

ただし、返される値を制御できるようにする場合は、time()(またはgettimeofday())の代理人を自分で定義する必要があります。ほとんどのライブラリは、PlaugerのThe Standard C Libraryに記載されている行に沿って設計されており、標準バージョンを置き換えて、好きなように動作するtime()という関数を提供することがよくあります。代わりに、より安全に、コードを修正して、simulated_time()と呼ばれる機能を呼び出すことができます。ここでは、simulated_time()time()(おそらくC99とC++の両方でインライン関数を使用します)を呼び出すことができますが、必要に応じて変更する時間をスケジュールする独自のバージョンにすることができます。

localtime()の使用を変更する必要はありません。それはあなたがそれを与えるtime_t値をstruct tmに変換するだけです。あなたはそれがいつものように答えを出すことを望みます。

0

実際の時計の進捗状況に応じて更新される内部時計が欲しいということを理解しています。

それではあなたはこのような何か作成します。

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; 
} 

ので、あなたがしたい、現在の時刻を設定initTimeを使用して、これは時間内にその瞬間にシステム時間にリンクされます。その構造体を使用してgetTimeを呼び出すと、開始点が経過した時間で更新されます。 (注、私はコードをテストしていないし、必要に応じて構造体を直接使用することもできます)。

秒未満の精度の場合、gettimeofdayに相当するtime()とtime_tを置き換えます。そして、変換、ascii arting、他の何かにブレークダウンするために、あなたはまだunix機能を使うことができます。

関連する問題