cocoa - qrs - qt/qtc valores normales
Determinación de intervalos de tiempo de milisegundos en cacao (2)
¿Cómo calculo, como un número entero, la cantidad de milisegundos entre ahora y la hora anterior que recordé como ahora?
¿Hay alguna razón por la que lo necesite como una cantidad integral de milisegundos? Solicitar NSDate por el intervalo de tiempo desde otra fecha le dará una cantidad de segundos en coma flotante. Si realmente necesita milisegundos, simplemente puede multiplicar por 1000 por 1000 para obtener un número de coma flotante de milisegundos. Si realmente necesita un número entero, puede redondear o truncar el valor de coma flotante.
Si desea hacerlo con números enteros de principio a fin, use UpTime
o mach_absolute_time
para obtener la hora actual en unidades absolutas, luego use AbsoluteToNanoseconds
para convertirla a una unidad del mundo real. Obviamente, tendrás que dividir eso por 1,000,000 para obtener milisegundos.
QA1398 sugiere mach_absolute_time
, pero UpTime
es más fácil, ya que devuelve el mismo tipo de uso de AbsoluteToNanoseconds
(sin "puntero divertido" como se muestra en la nota técnica).
AbsoluteToNanoseconds
devuelve UnsignedWide
, que es una estructura. (Esto se remonta a antes de que las máquinas Mac pudieran manejar valores escalares de 64 bits). Utilice la función UnsignedWideToUInt64
para convertirlo a escalar. Eso solo deja la resta, que harás de la manera normal.
Solo como fondo, estoy construyendo una aplicación en Cocoa. Esta aplicación existía originalmente en C ++ en otro entorno. Me gustaría hacer todo lo posible en Objective-C.
Mis preguntas son:
1) ¿Cómo calculo, como un número entero, la cantidad de milisegundos entre ahora y la hora anterior que recordé como ahora?
2) Cuando se utiliza en un programa de Object-C, incluido time.h, ¿cuáles son las unidades de
reloj()
Gracias por tu ayuda.
Puede usar CFAbsoluteTimeGetCurrent()
pero tenga en cuenta que el reloj puede cambiar entre dos llamadas y puede arruinarlo. Si quiere protegerse contra eso, debe usar CACurrentMediaTime()
.
El tipo de devolución de estos es CFAbsoluteTime
y CFTimeInterval
, respectivamente, que son double
por defecto. Entonces devuelven el número de segundos con double
precisión. Si realmente quieres un número entero, puedes usar mach_absolute_time()
encuentra en #include <mach/mach_time.h>
que devuelve un entero de 64 bits. Esto necesita un poco de conversión de unidades, así que echa un vistazo a este enlace, por ejemplo, el código. Esto es lo que CACurrentMediaTime()
usa internamente, por lo que es mejor quedarse con eso.
Calcular la diferencia entre dos llamadas obviamente es solo una resta, usar una variable para recordar el último valor.
Para la función del clock
, vea la documentación aquí: clock () . Básicamente, debe dividir el valor de retorno por CLOCKS_PER_SEC
para obtener el tiempo real.