Bestimmen der Millisekunden Zeitintervalle in Cocoa

8

Genau wie im Hintergrund baue ich eine Anwendung in Cocoa. Diese Anwendung existiert ursprünglich in C ++ in einer anderen Umgebung. Ich möchte in Objective-C so viel wie möglich machen.

Meine Fragen sind:

1) Wie berechne ich als Integer die Anzahl der Millisekunden zwischen dem jetzigen Zeitpunkt und dem vorherigen Zeitpunkt, an den ich mich gerade erinnert habe?

2) Bei Verwendung in einem Ziel-C-Programm, einschließlich time.h, was sind die Einheiten von

Uhr ()

Danke für Ihre Hilfe.

    
McPragma 12.12.2009, 14:37
quelle

2 Antworten

14

Sie können CFAbsoluteTimeGetCurrent() aber bedenken Sie, dass die Uhr zwischen zwei Anrufen wechseln kann und Sie überdrehen kann. Wenn Sie dagegen schützen möchten, sollten Sie CACurrentMediaTime() .

Der Rückgabetyp von diesen ist CFAbsoluteTime bzw. CFTimeInterval , die beide standardmäßig double sind. Sie geben also die Anzahl der Sekunden mit double precision zurück. Wenn Sie wirklich wollen, können Sie mach_absolute_time() in #include <mach/mach_time.h> verwenden, was eine 64-Bit-Ganzzahl liefert. Dies erfordert ein bisschen Umwandlung von Einheiten, also schauen Sie sich zum Beispiel diesen Link an. Dies ist, was CACurrentMediaTime() intern verwendet, also ist es wahrscheinlich am besten, dabei zu bleiben.

Das Berechnen der Differenz zwischen zwei Aufrufen ist offensichtlich nur eine Subtraktion, verwenden Sie eine Variable, um sich an den letzten Wert zu erinnern.

Für die Funktion clock siehe die Dokumentation hier: clock () . Grundsätzlich müssen Sie den Rückgabewert durch CLOCKS_PER_SEC teilen, um die tatsächliche Zeit zu erhalten.

    
Mike Weller 12.12.2009 15:03
quelle
6
  

Wie berechne ich als Integer die Anzahl der Millisekunden zwischen jetzt und der vorherigen Zeit, an die ich mich jetzt erinnerte?

Gibt es einen Grund, warum Sie es als ganzzahlige Millisekunden benötigen? Wenn Sie NSDate für das Zeitintervall nach einem anderen Datum anfordern, erhalten Sie eine Gleitkommazahl von Sekunden. Wenn Sie wirklich Millisekunden benötigen, können Sie einfach damit um 1000 multiplizieren, um eine Fließkommazahl von Millisekunden zu erhalten. Wenn Sie wirklich eine Ganzzahl benötigen, können Sie den Gleitkommawert runden oder abschneiden.

Wenn du es mit Ganzzahlen von Anfang bis Ende machen möchtest, verwende entweder UpTime oder mach_absolute_time , um die aktuelle Zeit in absoluten Einheiten zu erhalten, und dann AbsoluteToNanoseconds , um diese in eine reale Einheit umzuwandeln . Offensichtlich müssen Sie das durch 1.000.000 teilen, um Millisekunden zu erhalten.

QA1398 schlägt mach_absolute_time vor, aber UpTime ist einfacher, da es gibt den gleichen Typ AbsoluteToNanoseconds uses zurück (kein "Pointer Fun" wie in der technischen Anmerkung gezeigt).

AbsoluteToNanoseconds gibt eine UnsignedWide zurück, die eine Struktur ist. (Dieses Zeug stammt aus früheren Zeiten, bevor Mac-Maschinen skalare 64-Bit-Werte verarbeiten konnten.) Verwenden Sie die Funktion UnsignedWideToUInt64 , um sie in einen Skalar umzuwandeln. Das lässt nur die Subtraktion, die Sie auf die normale Weise tun werden.

    
Peter Hosey 12.12.2009 16:31
quelle

Tags und Links