support - ¿En qué se basa mach_absolute_time en iPhone?
support account twitter (2)
Utilizo este código para realizar un seguimiento del último reinicio:
+ (float) secondsSinceLastReboot{
return ((float)(mach_absolute_time())) * ((float)timebase.numer) / ((float)timebase.denom) / 1000000000.0f;
}
Asumí que mach_absolute_time () se basó en el último tiempo de arranque del dispositivo como en un mac. No parece estar basado en eso. En realidad no tengo idea de en qué se basa.
Mira el siguiente comportamiento (la fecha de hoy es 2009-09-20):
lastRebootTime = [[NSDate date] addTimeInterval:-[self secondsSinceLastReboot]];
//last Reboot Time will contain : 2009-09-20 07:42:14 +0100
Estoy absolutamente seguro de que no reinicié mi dispositivo en ese momento. Mi dispositivo no ha sido arrancado en una semana.
Además, cuando desconecto mi dispositivo del cable y ejecuto esta aplicación, parece que cuando el dispositivo entra en modo de suspensión, el último tiempo de inicio de sesión comienza a cambiar en el futuro. Parece que mach_absolute_time no tiene en cuenta el tiempo de suspensión. O estoy equivocado acerca de esto?
Realmente me gustaría poder obtener una marca de tiempo desde la última vez que se reinició el dispositivo. ¿Algunas ideas?
Si no le importa mucho el tiempo de cálculo, puede usar la clase simple Obj-C de Foundation
NSTimeInterval systemUptime = [[NSProcessInfo processInfo] systemUptime];
Tuve algunos problemas con esto yo mismo. No hay mucha documentación buena, así que fui con la experimentación. Esto es lo que pude determinar:
mach_absolute_time depende del procesador del dispositivo. Devuelve los ticks desde que el dispositivo se reinició por última vez (también conocido como tiempo de actividad). Para obtenerlo en una forma legible para el ser humano, debe modificarlo por el resultado de mach_timebase_info (una proporción), que devolverá la mil millonésima de segundos (o nanosegundos). Para hacer esto más utilizable, uso una función como la que se muestra a continuación:
#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));
}