37 Stimmen

Worauf basiert mach_absolute_time auf dem iPhone

Ich verwende diesen Code, um den letzten Neustart zu verfolgen:

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

Ich nahm an, dass mach_absolute_time() auf der letzten Bootzeit des Geräts basiert, wie es bei einem Mac der Fall ist. Es scheint nicht darauf zu basieren. Ich habe eigentlich keine Ahnung, worauf es basiert.

Sehen Sie sich das folgende Verhalten an (das heutige Datum ist 2009-09-20 ):

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

Ich bin mir absolut sicher, dass ich mein Gerät zu diesem Zeitpunkt nicht neu gestartet habe. Mein Gerät wurde seit einer Woche nicht mehr gebootet.

Wenn ich mein Gerät vom Kabel trenne und diese App ausführe, scheint es außerdem, dass sich die lastRebootTime in die Zukunft verschiebt, wenn das Gerät in den Ruhezustand geht. Es scheint mach_absolute_time die Schlafzeit nicht berücksichtigt. Oder liege ich da falsch?

Ich würde gerne einen Zeitstempel für den letzten Neustart des Geräts erhalten. Irgendeine Idee?

56voto

BadPirate Punkte 25244

Ich hatte selbst einige Probleme damit. Es gibt nicht viel gute Dokumentation, also habe ich ein wenig experimentiert. Hier ist, was ich in der Lage war, zu bestimmen:

mach_absolute_time hängt vom Prozessor des Geräts ab. Sie gibt die Ticks seit dem letzten Neustart des Geräts zurück (auch bekannt als Betriebszeit). Um sie in einer für den Menschen lesbaren Form zu erhalten, müssen Sie sie durch das Ergebnis von mach_timebase_info (ein Verhältnis) modifizieren, das Milliardstel von Sekunden (oder Nanosekunden) zurückgibt. Um dies besser nutzbar zu machen, verwende ich eine Funktion wie die folgende:

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

9voto

malex Punkte 9660

Wenn Sie nicht viel Wert auf die Rechenzeit legen, können Sie die einfache Obj-C-Klasse von Foundation verwenden

NSTimeInterval systemUptime = [[NSProcessInfo processInfo] systemUptime];

3voto

Benjamin Punkte 2924

Für den Fall, dass jemand es in Swift braucht (funktioniert in 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)
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X