2009-12-12 21 views
8

Proprio come sfondo, sto costruendo un'applicazione in Cocoa. Questa applicazione esisteva originariamente in C++ in un altro ambiente. Mi piacerebbe fare il più possibile in Objective-C.Determinazione degli intervalli di tempo in millisecondi in cacao

Le mie domande sono:

1) Come si calcola, come un intero, il numero di millisecondi tra oggi e la volta precedente ho ricordato come ora?

2) Quando utilizzato in un programma di Objective-C, tra cui time.h, quali sono le unità di

orologio()

Grazie per il vostro aiuto.

risposta

14

È possibile utilizzare CFAbsoluteTimeGetCurrent() ma tenere presente che l'orologio può passare da una chiamata all'altra e può rovinarsi. Se vuoi proteggerti dovresti usare CACurrentMediaTime().

Il tipo di ritorno di questi è CFAbsoluteTime e CFTimeInterval rispettivamente, che sono entrambi double per impostazione predefinita. Quindi restituiscono il numero di secondi con precisione double. Se si in realtà desidera un numero intero è possibile utilizzare mach_absolute_time() trovato in #include <mach/mach_time.h> che restituisce un numero intero a 64 bit. Questo richiede un po 'di conversione delle unità, quindi dai un'occhiata al codice this link. Questo è ciò che CACurrentMediaTime() utilizza internamente quindi è probabilmente meglio attenersi a questo.

Calcolare la differenza tra due chiamate è ovviamente solo una sottrazione, utilizzare una variabile per ricordare l'ultimo valore.

Per la funzione clock vedere la documentazione qui: clock(). Fondamentalmente è necessario dividere il valore restituito per CLOCKS_PER_SEC per ottenere l'ora effettiva.

+0

Non-C++ - collegamento del documento specifico per 'clock': http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man3/clock.3.html –

6

Come si calcola, come numero intero, il numero di millisecondi tra ora e la volta precedente che ho ricordato come ora?

C'è qualche motivo per cui è necessario come un numero intero di millisecondi? Richiedere NSDate per l'intervallo di tempo trascorso da un'altra data ti darà un numero in virgola mobile di secondi. Se hai davvero bisogno di millisecondi, puoi semplicemente moltiplicare per quello per 1000 per ottenere un numero in virgola mobile di millisecondi. Se hai davvero bisogno di un numero intero, puoi arrotondare o troncare il valore a virgola mobile.

Se vuoi farlo con numeri interi, dall'inizio alla fine, utilizzare UpTime o mach_absolute_time per ottenere l'ora corrente in unità assolute, quindi utilizzare per convertire AbsoluteToNanoseconds che ad un'unità del mondo reale. Ovviamente, dovrai dividerlo per 1.000.000 per ottenere millisecondi.

QA1398 suggerisce mach_absolute_time, ma UpTime è più facile, dal momento che restituisce lo stesso tipo AbsoluteToNanoseconds usi (non “puntatore fun”, come indicato nella nota tecnica).

AbsoluteToNanoseconds restituisce un UnsignedWide, che è una struttura. (Questa roba risale a prima che le macchine Mac potessero gestire valori scalari a 64 bit.) Utilizzare la funzione UnsignedWideToUInt64 per convertirla in uno scalare. Questo lascia solo la sottrazione, che farai nel modo normale.

Problemi correlati