2009-12-12 6 views
8

Como fondo, estoy creando 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.Determinación de intervalos de tiempo de milisegundos en Cocoa

Mis preguntas son:

1) ¿Cómo calculo, como un entero, el número de milisegundos desde ahora hasta la anterior vez que se acordó como ahora?

2) Cuando se utiliza en un programa de Objective-C, incluyendo time.h, ¿cuáles son las unidades de

reloj()

Gracias por su ayuda.

Respuesta

14

Puede usar CFAbsoluteTimeGetCurrent(), pero tenga en cuenta que el reloj puede cambiar entre dos llamadas y puede atornillarlo. Si desea protegerse contra eso, debe usar CACurrentMediaTime().

El tipo de retorno de estos es CFAbsoluteTime y CFTimeInterval respectivamente, que son ambos double por defecto. Entonces devuelven la cantidad de segundos con precisión double. Si realmente quiere un número entero, puede usar mach_absolute_time() que se encuentra en #include <mach/mach_time.h>, que devuelve un número entero de 64 bits. Esto necesita un poco de conversión de unidades, así que echa un vistazo a this link por ejemplo código. Esto es lo que CACurrentMediaTime() usa internamente, por lo que probablemente sea mejor quedarse con eso.

Calcular la diferencia entre dos llamadas es obviamente solo una resta, use una variable para recordar el último valor. Para obtener información sobre la función clock, consulte la documentación aquí: clock(). Básicamente, debe dividir el valor de retorno entre CLOCKS_PER_SEC para obtener el tiempo real.

+0

Enlace de doc no específico de C++ para 'clock': http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man3/clock.3.html –

6

¿Cómo calculo, como un número entero, el número de milisegundos entre ahora y la vez 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, utilice uno o UpTimemach_absolute_time para obtener la hora actual en unidades absolutas, a continuación, utilizar AbsoluteToNanoseconds para convertir eso a una unidad en el 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 AbsoluteToNanoseconds usos (sin “diversión puntero” 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). Use la función UnsignedWideToUInt64 para convertirlo a escalar. Eso solo deja la resta, que harás de la manera normal.

Cuestiones relacionadas