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.
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.
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.