2015-07-14 15 views
8

Ben yapı timespec değerlerin bir akışı var. Onları yerli bir C++ 11 temsiline dönüştürmek isterdim, ama tamamen chrono tarafından döndüm. Bu zamanlamalar için kolay bir dönüşüm ve mikro saniye yeterince iyi olduğundan en iyi hedef ve bir struct timespec veya struct timeeval oraya nasıl varılır? Buna ulaşmak istediğimi farz ediyorum, değil mi? std :: chrono :: system_clock :: time_pointstruct timespec'ten std :: chrono :: 'ya dönüştürme

Bu durumda, timespec bir GPS'den UNIX zamanıdır. Ve evet, onlar bir 4 bayt ikinci Referans için 2038

tarafından çivilenmiş alacak (dönüştürülen formu bellekte imzalanan ve daha sonra imzasız olarak yazılır), ben gsf

için C++ okuyucuya bu ekleyeceğiz kullanıyorsunuz

cevap

20

bazen timespec ve süreleri olarak kullanılan timeval, kimi zamanlar ben onları zaman noktaları olarak kullanılan bakınız. Ne tür değerler tuttuğunuzu bilmek zorundasınız. <chrono>'da bu iki kavram farklı tiplerdir.

bir süre zaman bir miktardır: Bir kronometre ile ölçüm bir şey. Örnek süreler 2 dakika, 3 saniye, 4 saat ve 16 yıldır.

bir zaman noktası, belirli bir zamanı: Bilgisayarımı başlattım 14:00 14 Temmuz 2015 EDT veya 6 saat beri. Bir zaman noktasında onunla ilişkili zımni bir dönem vardır. Bir dönem, zamanı ölçtüğünüz köken üzerinde sadece karşılıklı olarak anlaşılan bir miktardır.

sizin timespec bir süreyi tutarsa:

senin timespec bir zaman noktasında duruyor
timespec ts = {3, 123}; // 3 seconds + 123 nanoseconds 
auto d = std::chrono::seconds{ts.seconds} 
     + std::chrono::nanoseconds{ts.nanoseconds}; 

varsa, devrin bilmek zorunda. Dönem artık saniye (bu Unix time olan) ihmal, 1970-01-01 00:00:00 UTC olduğu muhtemeldir. Eğer öyleyse, bir std::chrono::system_clock::time_point içine koyabilirsiniz. Bu tip bu devrin için garanti değil ama her uygulama yapar:

d yukarıdaki gibi hesaplanır
using namespace std::chrono; 
system_clock::time_point tp{duration_cast<system_clock::duration>(d)}; 

.

timeval'unuz varsa, nanoseconds'u kullandığım microseconds kullanın.

high_resolution_clock veya steady_clock time_points öğelerini portably kullanamazsınız, çünkü farklı uygulamalar bu türler için farklı dönemlere sahiptir. Ayrıca

Eğer timeval kullanıyorsanız, pratikte duration_castd dolaylı system_clock::duration tüm uygulamalara dönüştürecek süresi gibi gereksiz hale gelir: Eğer gerekirse emin değilseniz

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

duration_cast veya değil, onsuz deneyin. Eğer derlerse, buna ihtiyacınız olmaz. Derleme zamanı hatası alırsanız, buna ihtiyacınız var. Süreleri dönüştürürken gereklidir ve tam bir dönüşüm yoktur.

+0

'Std :: krono :: system_clock' kolaylık yöntemleri' from_time_t' ve 'to_time_t' sahiptir. Bunlar, time_points’den bahsediyorsak daha taşınabilir bir dönüşüm sağlamalı. – user666412

+0

@ user666412: Evet. Ben from_time_t' ve 'to_time_t' C++ 11’e koydum.:-) Ne yazık ki 'time_t' genellikle hem integral hem de saniyeyi temsil ederken, 'timespec' ve' timeval' birimleri bir saniyeden daha iyi temsil eder. Yani, 'to/from_time_t' ifadesi, hassaslığınızı saniyelerle kesmeniz ve daha sonra bu hassasiyeti bir şekilde düzeltmeniz gerektiği anlamına gelir. Sizinle benim aramda, "to/from_time_t" nin yararı, uygulayıcıları "system_clock" için UnixTime "standardını" kullanmaya teşvik etmesidir. :-) –

+0

İlginç gerçek. Paylaşım için teşekkürler. Sadece 'to/from_time_t' çağını ayarlamak için taşınabilir bir yol olarak düşündüm, çünkü bu uygulama özel olabilir ve saniyeler kesirleri süre ile yaptığınız gibi eklenebilir. – user666412

İlgili konular