2015-07-14 13 views
8

Mam strumień wartości struct timespec. Chciałbym przekonwertować je na macierzystą reprezentację C++ 11, ale jestem całkowicie odwrócony przez chrono. Jaki jest najlepszy cel i jak dotrzeć do niego z struct timespec lub struct timeval, ponieważ jest to łatwa transformacja, a mikro sekundy są wystarczająco dobre dla tych czasów? Zakładam, że chcę to osiągnąć, prawda? std :: chrono :: system_clock :: time_pointKonwersja z struct timespec na std :: chrono ::?

W tym przypadku timespec to UNIX czas z GPS. I tak, są one za pomocą 4 bajtów na sekundę (formularz przekształcone podpisana w pamięci, a następnie zapisać jako unsigned), który będzie się przybity przez 2038.

odsyłającym będę dodając to do czytnika C++ dla gsf

Odpowiedz

20

Czasami widzę timespec i timeval jako czasy trwania, a czasami widzę je jako punkty czasowe. Będziesz musiał wiedzieć, jakie wartości trzymasz. W <chrono> te dwa pojęcia są różnymi typami.

Czas to ilość czasu: coś, co można zmierzyć za pomocą stopera. Przykładowe czasy trwania to 2 minuty, 3 sekundy, 4 godziny i 16 lat.

Punkt czasowy to konkretny czas: 14.00 14 lipca 2015 r. Lub 6 godzin od momentu uruchomienia komputera. Punkt czasowy ma przypisaną epokę z nim związaną. Epoka to tylko wspólnie uzgodnione pochodzenie, od którego mierzy się czas.

Jeśli timespec posiada czas trwania:

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

timespec Jeśli urządzenie posiada punkt w czasie, trzeba poznać epokę. Jest prawdopodobne, że epoką jest 1970-01-01 00:00:00 UTC, zaniedbując sekundy przestępne (to jest Unix time). Jeśli tak, możesz umieścić go w std::chrono::system_clock::time_point. Ten typ jest nie gwarancją mają tę epokę, ale każdy robi realizacja:

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

gdzie d obliczany jest jak wyżej.

Jeśli masz numer timeval, użyj microseconds gdzie użyłem nanoseconds.

Nie można przenośnie używać wartości czasowych high_resolution_clock lub steady_clock, ponieważ różne implementacje mają różne epoki dla tych typów.

Także jeśli używasz timeval, w praktyce staje się zbędne duration_cast jak czas trwania d będzie niejawnie przekonwertować do wszystkich implementacjach system_clock::duration:

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

Jeżeli nie jesteś pewien, czy potrzebne są duration_cast lub nie, spróbuj bez. Jeśli się kompiluje, nie potrzebujesz tego. Jeśli otrzymasz błąd podczas kompilacji, potrzebujesz go. Jest potrzebny podczas konwersji czasów trwania i nie ma dokładnej konwersji.

+0

'std :: chrono :: system_clock' ma dogodne metody' from_time_t' i 'to_time_t'. Powinny one zapewnić bardziej przenośną konwersję, jeśli mówimy o 'punktach czasowych'. – user666412

+0

@ user666412: Tak. Wstawiłem 'from_time_t' i' to_time_t' do C++ 11.:-) Niestety 'time_t' jest zwykle zarówno całkowite, jak i reprezentuje sekundy, podczas gdy oba' timespec' i 'timeval' reprezentują jednostki lepsze niż sekundę. Przechodzenie przez 'do/od_czasu_t" oznacza, że ​​musisz skrócić precyzję do sekund, a następnie odzyskać tę dokładność. Pomiędzy tobą a mną, korzyścią 'to/from_time_t' jest to, że zachęcił on implementatorów do używania standardu UnixTime dla' system_clock'. :-) –

+0

Interesujący fakt. Dziękuję za podzielenie się. Po prostu myślałem o 'to/from_time_t' jako przenośnym sposobie dostosowywania epoki, ponieważ może to być specyficzna implementacja, a ułamki sekund mogą być dodawane w taki sam sposób, jak w przypadku czasu trwania. – user666412

Powiązane problemy