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.
'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
@ 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'. :-) –
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