2015-07-14 15 views
8

Ho uno stream di struct timespec values. Mi piacerebbe convertirli in una rappresentazione nativa di C++ 11, ma sono totalmente girata da chrono. Qual è la migliore destinazione e come arrivarci da una struct timepec o struct timeval dato che è una trasformazione semplice e micro secondi è abbastanza buono per questi tempi? Presumo che voglio arrivare a questo, giusto? std :: crono :: :: system_clock time_pointConversione da struct timespec a std :: chrono ::?

In questo caso, il timespec è giunto il momento di UNIX da un GPS. E sì, stanno usando un secondo di 4 byte (modulo convertito firmato in memoria e poi scritto come non firmato) che andranno inchiodato da 2038.

Per riferimento, sarò l'aggiunta di questa al lettore C++ per gsf

risposta

20

A volte vedo timespec e timeval utilizzati come durate e talvolta li vedo usati come punti di tempo. Dovrai sapere che tipo di valori hai in mano. In <chrono> questi due concetti sono di tipo diverso.

Una durata è una quantità di tempo: qualcosa che si misurerebbe con un cronometro. Le durate di esempio sono 2 minuti, 3 secondi, 4 ore e 16 anni.

Un punto temporale è un orario specifico: 14:00 14 luglio 2015 EDT o 6 ore da quando ho avviato il computer. Un punto temporale ha un'epoca implicita associata ad esso. Un'epoca è solo un'origine reciprocamente concordata con la quale stai misurando il tempo.

Se il timespec detiene una durata:

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

Se il timespec detiene un punto di tempo, è necessario conoscere l'epoca. È probabile che l'epoca sia 1970-01-01 00:00:00 UTC, trascurando secondi bisestili (questo è Unix time). In tal caso, puoi inserirlo in un std::chrono::system_clock::time_point. Questo tipo è non garantiti di avere questa epoca, ma ogni implementazione fa:

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

dove d viene calcolato come sopra.

Se si dispone di un timeval, quindi utilizzare microseconds dove ho utilizzato nanoseconds.

Non è possibile utilizzare Portatili high_resolution_clock o steady_clock time_points perché diverse implementazioni hanno epoche diverse per questi tipi.

anche se si sta utilizzando timeval, in pratica la duration_cast diventa inutile come la durata d sarà convertire implicitamente a tutte le implementazioni di system_clock::duration:

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

Se non siete sicuri se avete bisogno di duration_cast o no, provalo senza Se viene compilato, non ne hai bisogno. Se ottieni un errore in fase di compilazione, ne hai bisogno. È necessario quando si convertono le durate e non c'è una conversione esatta.

+0

'std :: chrono :: system_clock' ha i metodi di convenienza' from_time_t' e 'to_time_t'. Questi dovrebbero assicurare una conversione più portabile, se stiamo parlando di 'time_points'. – user666412

+0

@ user666412: Sì. Ho messo 'from_time_t' e' to_time_t' in C++ 11.:-) Sfortunatamente 'time_t' è in genere sia integrale che rappresenta secondi, mentre sia' timespec' che 'timeval' rappresentano unità più sottili di un secondo. Quindi passare a 'to/from_time_t' significa che devi troncare la tua precisione in secondi, e poi in qualche modo recuperare quella precisione. Tra te e me, il vantaggio di 'to/from_time_t' è che ha incoraggiato gli implementatori a usare lo" standard "di UnixTime per' system_clock'. :-) –

+0

Fatto interessante. Grazie per aver condiviso. Ho solo pensato a 'to/from_time_t' come un modo portatile per regolare l'epoca, dal momento che può essere specifico per l'implementazione e le frazioni di secondi possono essere aggiunte nello stesso modo in cui lo hai fatto con la durata. – user666412

Problemi correlati