2008-10-14 10 views
4

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

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

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

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

ответ

-1

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

1

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

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

0

Часы настенные часы могут быть рассчитаны с использованием времени() звонок.

-1

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

2

Я думаю, вы всегда можете запустить какой-то таймер. Например под 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

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