steady_clock ejemplo c++ time chrono

ejemplo - steady_clock c++



Conversión de struct timespec a std:: chrono::? (1)

Tengo una secuencia de valores struct timespec. Me gustaría convertirlos a una representación nativa de C ++ 11, pero estoy totalmente alterado por Chrono. ¿Cuál es el mejor destino y cómo llegar desde una struct timespec o struct timeval ya que es una transformación fácil y microsegundos es lo suficientemente bueno para estos tiempos? Supongo que quiero llegar a esto, ¿verdad? std :: chrono :: system_clock :: time_point

En este caso, el timespec es el tiempo UNIX desde un GPS. Y sí, están usando un segundo de 4 bytes (formulario convertido firmado en la memoria y luego escrito como sin firmar) que se conseguirá en 2038.

Como referencia, voy a agregar esto al lector C ++ para gsf


A veces veo timespec y timeval utilizados como duraciones, y a veces los veo usados ​​como puntos de tiempo. Deberá saber qué tipo de valores tiene. En <chrono> estos dos conceptos son tipos diferentes.

Una duración es una cantidad de tiempo: algo que medirías con un cronómetro. Las duraciones de los ejemplos son 2 minutos, 3 segundos, 4 horas y 16 años.

Un punto de tiempo es una hora específica: 2pm 14 de julio de 2015 EDT, o 6 horas desde que inicié mi computadora. Un punto de tiempo tiene una época implícita asociada a él. Una época es solo un origen mutuamente acordado con el que estás midiendo el tiempo.

Si su timespec tiene una duración:

timespec ts = {3, 123}; // 3 seconds + 123 nanoseconds auto d = std::chrono::seconds{ts.seconds} + std::chrono::nanoseconds{ts.nanoseconds};

Si su timespec tiene un punto de tiempo, debe conocer la época. Es probable que la época sea 1970-01-01 00:00:00 UTC, dejando de lado los segundos intercalares (este es el tiempo Unix ). Si es así, puede ponerlo en std::chrono::system_clock::time_point . No se garantiza que este tipo tenga esta época, pero cada implementación hace:

using namespace std::chrono; system_clock::time_point tp{duration_cast<system_clock::duration>(d)};

donde d se calcula como arriba.

Si tiene un timeval , entonces use microseconds donde he usado nanoseconds .

No puede usar de forma portátil high_resolution_clock o steady_clock time_points porque las diferentes implementaciones tienen diferentes épocas para estos tipos.

Además, si está utilizando timeval , en la práctica el duration_cast es necesario ya que la duración d convertirá implícitamente a todas las implementaciones de system_clock::duration :

using namespace std::chrono; system_clock::time_point tp{d};

Si no está seguro de si necesita el duration_cast o no, inténtelo sin él. Si se compila, no lo necesita. Si obtiene un error en tiempo de compilación, lo necesita. Es necesario al convertir duraciones y no hay una conversión exacta.