web-dev-qa-db-fra.com

Qu'est-ce que Mach_Absolute_Time est basé sur iPhone

J'utilise ce code pour garder une trace du dernier redémarrage:

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

J'ai supposé que mach_absolute_time () était basé sur le dernier temps de démarrage de l'appareil comme il est sur un Mac. Cela ne semble pas être basé sur cela. En fait, je n'ai aucune idée de ce qu'il est basé.

Regardez le comportement suivant (la date d'aujourd'hui est 2009-09-20):

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

Je suis absolument certain que je n'ai pas redémarré mon appareil à ce moment-là. Mon appareil n'a pas été démarré dans une semaine.

En outre, lorsque je décroche mon appareil dans le câble et exécutez cette application, il semble que lorsque l'appareil se couche en veille, le Lastreboottime commence à déplacer à l'avenir. Il semble que Mach_Absolute_Time ne garde pas compte pour le temps de veille. Ou je me trompe à ce sujet?

J'aimerais vraiment pouvoir obtenir un horodatage de l'appareil lorsque l'appareil a été redémarré. Des idées?

31
Maxm007

Eu des problèmes avec cela moi-même. Il n'y a pas beaucoup de bonne documentation, alors je suis allé avec expérimentation. Voici ce que j'ai pu déterminer:

mach_absolute_Time dépend du processeur de l'appareil. Il renvoie des ticks car l'appareil a été redémarré (autrement connu sous le nom de disponibilité). Afin de l'obtenir sous une forme lisible humaine, vous devez le modifier par le résultat de Mach_TimeBase_info (un ratio), qui retournera le milliardième de secondes (ou nanosecondes). Pour que cela soit plus utilisable, j'utilise une fonction comme celle ci-dessous:

#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));
}
49
BadPirate

Si vous ne vous souciez pas beaucoup de temps de calcul, vous pouvez utiliser une classe OBJ-C simple de la fondation

NSTimeInterval systemUptime = [[NSProcessInfo processInfo] systemUptime];
9
malex

Si quelqu'un en ait besoin dans Swift (fonctionne dans 4.2 & 5.0).

let beginTime = mach_absolute_time()

// do something...

var baseInfo = mach_timebase_info_data_t(numer: 0, denom: 0)
if mach_timebase_info(&baseInfo) == KERN_SUCCESS {
    let finiTime = mach_absolute_time()

    let nano = (finiTime - beginTime) * UInt64(baseInfo.numer) / UInt64(baseInfo.denom)
}
1
Mint