истекшее время с начала процесса - PullRequest
4 голосов
/ 14 октября 2008

Мне нужен способ получить истекшее время (время настенных часов) с момента запуска программы, таким образом, чтобы он был устойчивым для пользователей, вмешивающихся в системные часы.

В Windows нестандартная реализация clock () не справляется с задачей, так как, похоже, она работает, просто вычисляя разницу со временем, отобранным при запуске, так что я получаю отрицательные значения, если я "перемещаю часы Руки назад ".

В UNIX часы / getrusage относятся к системному времени, тогда как использование функции, такой как gettimeofday для выборки временных меток, имеет ту же проблему, что и использование часов в windows.

Меня не особо интересует точность, и я взломал решение, установив таймер с полусекундным разрешением, вращающийся на заднем плане, противодействующий перекосам часов, когда они происходят (если разница между временем выборки и ожидаемым превышает 1 секунду, я использую ожидаемый таймер для новой базовой линии), но я думаю, что должен быть лучший способ.

Ответы [ 6 ]

2 голосов
/ 01 мая 2009

Для POSIX используйте clock_gettime() с CLOCK_MONOTONIC.

2 голосов
/ 14 октября 2008

Полагаю, вы всегда можете запустить какой-нибудь таймер. Например под Linux нить это будет иметь такой цикл:

static void timer_thread(void * arg)
{
        struct timespec delay;
        unsigned int msecond_delay = ((app_state_t*)arg)->msecond_delay;

        delay.tv_sec = 0;
        delay.tv_nsec = msecond_delay * 1000000;

        while(1) {
                some_global_counter_increment();
                nanosleep(&delay, NULL);
        }
}

Где app_state_t - это структура приложения на ваш выбор, где вы храните переменные. Если вы хотите предотвратить подделку, вы должны быть уверены, что никто не убил вашу ветку

1 голос
/ 14 октября 2008

Не думаю, что вы найдете кроссплатформенный способ сделать это.

В Windows вам нужно GetTickCount (или, возможно, QueryPerformanceCounter и QueryPerformanceFrequency для таймера высокого разрешения). У меня нет опыта в Linux, но поиск в Google дал мне clock_gettime .

0 голосов
/ 14 октября 2008

/ proc / uptime в linux поддерживает количество секунд, в течение которых система работала (и количество секунд, в течение которых она простаивала), на которые не должны влиять изменения часов, поскольку они поддерживаются системным прерыванием / Хз). Возможно, в Windows есть что-то похожее?

0 голосов
/ 14 октября 2008

Время настенных часов может быть немного вычислено с помощью вызова time () .

0 голосов
/ 14 октября 2008

Если у вас есть сетевое соединение, вы всегда можете получить время с NTP-сервера. Это, очевидно, не будет затронуто ни одним из местных часов.

...