Замена time () и localtime () независимыми от пользователя эквивалентами - PullRequest
0 голосов
/ 12 апреля 2009

У меня есть программа, которая использует 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);

Ответы [ 3 ]

1 голос
/ 12 апреля 2009

A time_t в POSIX-совместимых системах - это просто количество секунд, прошедшее с эпохи , 1 января 1970 года, 00:00: 00.

Просто добавьте (возможно, отрицательное) значение к time_t, чтобы изменить время, убедившись, что значение не переполняется, затем используйте localtime как обычно.

0 голосов
/ 12 апреля 2009

Насколько я понимаю, вам нужны внутренние часы, которые обновляются в соответствии с ходом реальных часов.

Итак, вы бы создали что-то вроде этого:

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 с использованием этой структуры, она обновляет начальную точку в зависимости от времени выполнения. (Обратите внимание, я не тестировал код, и вы можете использовать структуру напрямую, если хотите).

Для точности с точностью до секунды замените time () и time_t эквивалентом gettimeofday. А для конвертации, ascii arting, разбивки на что-либо, кроме второго счетчика, вы все равно можете использовать функцию unix.

0 голосов
/ 12 апреля 2009

Если вам нужно всего лишь второе разрешение, тогда можно использовать time(); если вам нужно разрешение менее секунды, используйте gettimeofday().

Однако, если вы хотите иметь возможность контролировать возвращаемые значения, вам нужно определить себя суррогатом для time() (или gettimeofday()). Большинство библиотек спроектированы в соответствии с описанием, изложенным в Стандартной библиотеке на языке C , разработанной Плаугером, и вы часто можете предоставить функцию с именем time(), которая будет вести себя как вам угодно, заменяя стандартную версию. В качестве альтернативы, и более безопасно, вы можете пересмотреть свой код, чтобы вызвать функцию вашего собственного устройства, возможно, под названием simulated_time(), где для производственной работы вы можете simulated_time() вызвать реальный time() (возможно, через встроенную функцию в обоих C99 и C ++), но это может быть ваша собственная версия, которая планирует время для изменения по мере необходимости.

Вам не нужно изменять использование localtime(); он просто конвертирует любое значение time_t, которое вы ему дадите, в struct tm; Вы хотите, чтобы он давал ответы так же, как всегда.

...