2015-05-12 6 views
1

Мне нужно измерить прошедшее время, чтобы узнать, когда превышен определенный период времени.Измерение прошедшего времени в OS X

Для этого я использовал Ticks() и Microseconds(), но обе функции устарели.

CFAbsoluteTimeGetCurrent не правильный способ использовать, потому что она может работать в обратном направлении, как описано в документации:

Повторные вызовы этой функции не гарантируют монотонно возрастающие результаты. Системное время может уменьшаться из-за синхронизации с внешними ссылками по времени или из-за явного изменения пользователем часов в .

Что еще существует, что не является устаревшим и справедливым в будущем?

+1

' mach_absolute_time'? Увлекательная дискуссия здесь: http://stackoverflow.com/questions/23378063/how-can-i-use-mach-absolute-time-without-overflowing (Не в тему: Привет, Томас!) – matt

+0

(Привет, MattN!) Да , спасибо за указатель о mach_absolute_time - я нашел Q & A 1398 в то же время, но не знал о переполнениях. Я бы ожидал, что есть и другие способы, хотя, возможно, использование таймеров (хотя я не знаю, действуют ли они правильно, если часы меняются назад). –

+1

Одна из других устаревших функций синхронизации, 'UpTime', объявлена ​​в DriverServices.h. Комментарии в этом заголовке говорят «Используйте CFAbsoluteTime или mach time подпрограммы». – JWWalker

ответ

1

Один из способов, как описано в Q&A 1398, заключается в использовании mach_absolute_time следующим образом:

static mach_timebase_info_data_t sTimebaseInfo; 
    mach_timebase_info(&sTimebaseInfo); // Determines the time scale 

    uint64_t t1 = mach_absolute_time(); 
    ... 
    uint64_t t2 = mach_absolute_time(); 
    uint64_t elapsedNano = (t2-t1) * sTimebaseInfo.numer/sTimebaseInfo.denom; 

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

+1

У меня были хорошие результаты с 'mach_absolute_time'. Некоторое время назад я сделал небольшую оболочку класса Cocoa вокруг нее, как описано [здесь] (http://zpasternack.org/high-resolution-timing-in-cocoa-revisited/). – zpasternack

0

Использование NSTimeInterval:

Используется для указания интервала времени в секундах.

Пример:

- (void)loop { 

    NSDate *startTime = [NSDate date]; 

    sleep(90); // sleep for 90 seconds 

    [self elapsedTime:startTime]; 
} 

- (void)elapsedTime:(NSDate *)startTime { 

NSTimeInterval elapsedTime = fabs([startTime timeIntervalSinceNow]); 

int intSeconds = (int) elapsedTime; 
int intMinutes = intSeconds/60; 
intSeconds = intSeconds % 60; 

NSLog(@"Elapsed Time: %d minute(s) %d seconds", intMinutes, intSeconds); 

} 

Результат:

Elapsed Time: 1 minute(s) 29 seconds 

Неясно, какой тип точности вы ищете, хотя NSTimeInterval может вместить доли секунды (например. десятые, сотые, тысячные и т. д.)

+0

NSDate, как и CFAbsoluteTimeGetCurrent, способен работать в обратном направлении, правда? Я имею в виду, что пользователь может просто изменить свои часы вручную, и у вас уже есть это. Или это не 'timeIntervalSinceNow' склонны к этому? –

+0

Да, к сожалению, почти любой метод даты/времени склонен к этому. Если вы беспокоитесь о возможности этого, вы можете сделать проверку в течение определенного интервала прошедшего времени, чтобы определить, меньше ли текущее время, чем время начала, - и если оно тогда недействительно. –

Смежные вопросы