Konvertieren von struct timepec in std :: chrono ::?

8

Ich habe einen Strom von Struktur-Zeitspannenwerten. Ich würde sie gern in eine native C ++ 11-Darstellung umwandeln, aber ich bin total von Chrono umgedreht. Was ist das beste Ziel und wie kommt man von einer Struktur Timespec oder Struct Timeval da dies eine einfache Transformation ist und Mikrosekunden gut genug für diese Timings ist? Ich nehme an, dass ich dazu kommen möchte, oder?     std :: chrono :: system_uhr :: zeitpunkt

In diesem Fall ist timespec die UNIX-Zeit von einem GPS. Und ja, sie verwenden eine 4-Byte-Sekunde (konvertierte Form, die im Speicher signiert und dann als vorzeichenlos geschrieben ist), die von 2038 genagelt wird.

Als Referenz werde ich dies dem C ++ - Reader für gsf

    
Kurt Schwehr 14.07.2015, 14:07
quelle

1 Antwort

20

Manchmal sehe ich timespec und timeval als Dauer und manchmal sehe ich sie als Zeitpunkte. Sie müssen wissen, welche Art von Werten Sie halten. In <chrono> sind diese beiden Konzepte verschiedene Typen.

Eine Dauer ist eine Zeitmenge: etwas, das Sie mit einer Stoppuhr messen würden. Beispieldauern sind 2 Minuten, 3 Sekunden, 4 Stunden und 16 Jahre.

Ein Zeitpunkt ist eine bestimmte Zeit: 14 Uhr, 14.07.2015, EDT, oder 6 Stunden, seit ich meinen Computer hochgefahren habe. Ein Zeitpunkt weist eine implizierte Epoche auf. Eine Epoche ist nur ein gemeinsam vereinbarter Ursprung, mit dem Sie die Zeit messen.

Wenn Ihr timespec eine Dauer hat:

%Vor%

Wenn Ihr timespec einen Zeitpunkt enthält, müssen Sie die Epoche kennen. Es ist wahrscheinlich, dass die Epoche 1970-01-01 00:00:00 UTC ist, wobei die Schaltsekunden vernachlässigt werden (dies ist Unix-Zeit ). Wenn ja, können Sie es in ein std::chrono::system_clock::time_point setzen. Dieser Typ ist nicht garantiert diese Epoche, aber jede Implementierung tut:

%Vor%

wobei d wie oben berechnet wird.

Wenn du timeval hast, dann benutze microseconds , wo ich nanoseconds benutzt habe.

Sie können high_resolution_clock oder steady_clock time_points nicht portabel verwenden, da verschiedene Implementierungen unterschiedliche Epochen für diese Typen aufweisen.

Auch wenn Sie timeval verwenden, wird in der Praxis duration_cast überflüssig, da die Dauer d implizit in alle Implementierungen von system_clock::duration konvertiert wird:

%Vor%

Wenn Sie nicht sicher sind, ob Sie duration_cast benötigen oder nicht, versuchen Sie es ohne. Wenn es kompiliert wird, brauchst du es nicht. Wenn Sie einen Fehler bei der Kompilierung bekommen, brauchen Sie ihn. Es wird benötigt, wenn die Dauer konvertiert wird und es keine genaue Konvertierung gibt.

    
Howard Hinnant 14.07.2015, 18:21
quelle

Tags und Links