Замороженное время работы на iOS / iPhone - PullRequest
6 голосов
/ 19 мая 2011

Кто-нибудь знает, почему я испытываю странное время безотказной работы с помощью следующего метода?

NSProcessInfo *processInfo = [NSProcessInfo processInfo];
NSTimeInterval systemUptime = [processInfo systemUptime];

В первые минуты все кажется хорошо, но когда я возвращаюсь в приложение через несколько часов или дней, время безотказной работы составляетвсе тот же: 30 минут или 1ч 34 ... кажется, что он завис в случайный момент.В основном на iPhone 4 (редко на симуляторе или iPad)

Это может быть связано с моим способом его отображения:

+ (NSTimeInterval)uptime:(NSNumber **)days hours:(NSNumber **)hours mins:(NSNumber **)mins
{
    NSProcessInfo *processInfo = [NSProcessInfo processInfo];
        //START UPTIME///////
    NSTimeInterval systemUptime = [processInfo systemUptime];
        // Get the system calendar
    NSCalendar *sysCalendar = [NSCalendar currentCalendar];
        // Create the NSDates
    NSDate *date = [[NSDate alloc] initWithTimeIntervalSinceNow:(0-systemUptime)]; 
    unsigned int unitFlags = NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit;
    NSDateComponents *c = [sysCalendar components:unitFlags fromDate:date toDate:[NSDate date]  options:0]; 
        //NSString *uptimeString = [NSString stringWithFormat:@"%dd %dh %dmin", [c day],[c hour],[c minute]];
    *days = [NSNumber numberWithInt:[c day]];
    *hours = [NSNumber numberWithInt:[c hour]];
    *mins = [NSNumber numberWithInt:[c minute]];
    [date release];
        //END UPTIME////////

    return systemUptime;
}

И позже в коде:

NSNumber *uptimeDays, *uptimeHours, *uptimeMins;
[CJGDevice uptime:&uptimeDays hours:&uptimeHours mins:&uptimeMins];
NSString *uptimeString = [NSString stringWithFormat:@"%@d %@h %@min",
                          [uptimeDays stringValue],
                          [uptimeHours stringValue],
                          [uptimeMins stringValue]];

РЕДАКТИРОВАТЬ: после 3 дней записи результатов на iPad и iPhone я вижу, что это время работоспособности неправильное, время идет слишком медленно, чем больше мы ждем, тем больше становится очевидно, что уже поздно

Ответы [ 3 ]

9 голосов
/ 21 сентября 2011

Этот метод делает свое дело:

- (time_t)uptime
{
    struct timeval boottime;
    int mib[2] = {CTL_KERN, KERN_BOOTTIME};
    size_t size = sizeof(boottime);
    time_t now;
    time_t uptime = -1;

    (void)time(&now);    

    if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0) 
    {
        uptime = now - boottime.tv_sec;
    }
    return uptime;
}

Спасибо Аластеру Стюарту за ссылку .

5 голосов
/ 21 мая 2011

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

Источник: http://developer.apple.com/library/ios/releasenotes/Cocoa/Foundation.html

2 голосов
/ 08 сентября 2011

Посмотрите, как это делает команда Дарвина. Источник здесь .

Часть, которую вы хотите прочитать, - это функция pr_header (), особенно в следующих строках:

if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0) {
    uptime = now - boottime.tv_sec;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...