Что такое mach_absolute_time на основе iPhone - PullRequest
31 голосов
/ 20 сентября 2009

Я использую этот код для отслеживания последней перезагрузки:

+ (float) secondsSinceLastReboot{
     return ((float)(mach_absolute_time())) * ((float)timebase.numer) / ((float)timebase.denom) / 1000000000.0f;
}

Я предположил, что mach_absolute_time () основывался на времени последней загрузки устройства, как на Mac. Кажется, это не основано на этом. Я на самом деле понятия не имею, на чем он основан.

Посмотрите на следующее поведение (сегодняшняя дата 2009-09-20):

lastRebootTime = [[NSDate date] addTimeInterval:-[self secondsSinceLastReboot]];
//last Reboot Time will contain : 2009-09-20 07:42:14 +0100

Я абсолютно уверен, что в то время я не перезагружал свое устройство. Мое устройство не загружалось в течение недели.

Кроме того, когда я отсоединяю свое устройство от кабеля и запускаю это приложение, кажется, что, когда устройство переходит в спящий режим, lastRebootTime начинает сдвигаться в будущем. Кажется, что mach_absolute_time не учитывает время сна. Или я ошибаюсь по этому поводу?

Мне бы очень хотелось получить временную метку от последней перезагрузки устройства. Есть идеи?

Ответы [ 2 ]

48 голосов
/ 21 января 2011

У меня были некоторые проблемы с этим самим. Хорошей документации не так много, поэтому я пошел экспериментировать. Вот что мне удалось определить:

mach_absolute_time зависит от процессора устройства. Он возвращает тики с момента последней перезагрузки устройства (также известной как uptime). Чтобы получить его в удобочитаемой форме, вы должны изменить его по результату mach_timebase_info (отношение), которое будет возвращать миллиардные доли секунды (или наносекунды). Чтобы сделать это более удобным, я использую функцию, подобную приведенной ниже:

#include <mach/mach_time.h>

int getUptimeInMilliseconds()
{
    const int64_t kOneMillion = 1000 * 1000;
    static mach_timebase_info_data_t s_timebase_info;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        (void) mach_timebase_info(&s_timebase_info);
    });

    // mach_absolute_time() returns billionth of seconds,
    // so divide by one million to get milliseconds
    return (int)((mach_absolute_time() * s_timebase_info.numer) / (kOneMillion * s_timebase_info.denom));
}
9 голосов
/ 13 декабря 2013

Если вас не волнует время вычислений, вы можете использовать простой класс Obj-C из Foundation

NSTimeInterval systemUptime = [[NSProcessInfo processInfo] systemUptime];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...