2016-04-20 25 views
1

Während ich realisiere, dies ist wahrscheinlich eine von vielen identischen Fragen, ich kann nicht scheinen, wie man richtig zu verwenden std :: chrono. Das ist die Lösung, die ich zusammengeschustert habe.Korrekte Methode der Verwendung von Std :: Chrono

#include <stdlib.h> 
#include <iostream> 
#include <chrono> 

typedef std::chrono::high_resolution_clock Time; 
typedef std::chrono::milliseconds ms; 

float startTime; 

float getCurrentTime(); 

int main() { 
    startTime = getCurrentTime(); 
    std::cout << "Start Time: " << startTime << "\n"; 

    while(true) { 
     std::cout << getCurrentTime() - startTime << "\n"; 
    } 

    return EXIT_SUCCESS; 
} 

float getCurrentTime() { 
    auto now = Time::now(); 
    return std::chrono::duration_cast<ms>(now.time_since_epoch()).count()/1000; 
} 

Aus irgendeinem Grunde, dies gibt immer nur ganzzahlige Werte als die Differenz, die sie nach oben mit einer Rate von 1 pro Sekunde erhöht, sondern von einem beliebigen, oft negativ, Wert beginnend.

Was mache ich falsch? Gibt es einen besseren Weg, dies zu tun?

+0

das Ergebnis von zwei integralen Argumenten miteinander unterteilt ist ein ganzzahliger Wert. – SergeyA

+0

@SergeyA Das behebt das Ergebnis nicht als Float, aber es beginnt immer noch mit der falschen Nummer. – Arkathorn

+0

'zurück std :: chrono :: duration_cast (now.time_since_epoch()). Count()/1000.0F;' –

Antwort

7
  • Entkommen Sie dem Chrono-System nicht, bis Sie es unbedingt tun müssen. Das heißt, verwenden Sie .count() außer für E/A oder Interaktion mit Legacy-API.

Dies bedeutet: Verwenden Sie nicht float als time_point.

  • Nicht stören mit high_resolution_clock. Dies ist immer ein Typdef zu system_clock oder steady_clock. Wählen Sie für mehr tragbaren Code eines der letzteren.

.

#include <iostream> 
#include <chrono> 

using Time = std::chrono::steady_clock; 
using ms = std::chrono::milliseconds; 

zu starten, wirst du eine Dauer mit einer Darstellung von float und den Einheiten von seconds müssen. Dies ist, wie Sie das tun:

using float_sec = std::chrono::duration<float>; 

Weiter Sie time_point müssen die Time als Takt verwendet, und float_sec als seine Dauer:

using float_time_point = std::chrono::time_point<Time, float_sec>; 

Jetzt ist Ihre getCurrentTime() kann nur Time::now() zurück. Keine Hektik, kein Durcheinander:

float_time_point 
getCurrentTime() { 
    return Time::now(); 
} 

Ihre main, weil es die I/O zu tun hat, zum Entpacken der Chrono-Typen in Skalare verantwortlich ist, so dass er sie drucken:

int main() { 
    auto startTime = getCurrentTime(); 
    std::cout << "Start Time: " << startTime.time_since_epoch().count() << "\n"; 

    while(true) { 
     std::cout << (getCurrentTime() - startTime).count() << "\n"; 
    } 
} 
+0

Mit diesem Code 'getCurrentTime(). Time_since_epoch().count() 'gibt immer den gleichen Wert zurück. Irgendeine Idee warum? – Arkathorn

+0

@Arkathorn: Auf meinem System gibt dies die Anzahl der Fließkommasekunden seit dem Start des Computers zurück. Es ändert sich wie erwartet jedes Mal, wenn ich das Programm starte. Wenn ich es zweimal hintereinander anrufe, scheint es den gleichen Wert zu haben, da es nur mit einer Genauigkeit von einer Zehntelsekunde gedruckt wird. Auf welcher Plattform bist du? –

+0

Windows 10. Es gibt immer '1.46119e + 012' zurück. – Arkathorn

0

Dieses Programm macht eine ähnliche Sache. Hoffentlich zeigt es, einige der Fähigkeiten (und Methodik) von std :: chrono:

#include <iostream> 
#include <chrono> 
#include <thread> 


int main() 
{ 
    using namespace std::literals; 
    namespace chrono = std::chrono; 
    using clock_type = chrono::high_resolution_clock; 

    auto start = clock_type::now(); 

    for(;;) { 
     auto first = clock_type::now(); 

     // note use of literal - this is c++14 
     std::this_thread::sleep_for(500ms); 

     // c++11 would be this: 
     //  std::this_thread::sleep_for(chrono::milliseconds(500)); 

     auto last = clock_type::now(); 
     auto interval = last - first; 
     auto total = last - start; 

     // integer cast 
     std::cout << "we just slept for " << chrono::duration_cast<chrono::milliseconds>(interval).count() << "ms\n"; 

     // another integer cast 
     std::cout << "also known as " << chrono::duration_cast<chrono::nanoseconds>(interval).count() << "ns\n"; 

     // floating point cast 
     using seconds_fp = chrono::duration<double, chrono::seconds::period>; 
     std::cout << "which is " << chrono::duration_cast<seconds_fp>(interval).count() << " seconds\n"; 

     std::cout << " total time wasted: " << chrono::duration_cast<chrono::milliseconds>(total).count() << "ms\n"; 
     std::cout << "   in seconds: " << chrono::duration_cast<seconds_fp>(total).count() << "s\n"; 


     std::cout << std::endl; 
    } 
    return 0; 
} 

Ausgabe:

we just slept for 503ms 
also known as 503144616ns 
which is 0.503145 seconds 
    total time wasted: 503ms 
     in seconds: 0.503145s 

we just slept for 500ms 
also known as 500799185ns 
which is 0.500799 seconds 
    total time wasted: 1004ms 
     in seconds: 1.00405s 

we just slept for 505ms 
also known as 505114589ns 
which is 0.505115 seconds 
    total time wasted: 1509ms 
     in seconds: 1.50923s 

we just slept for 502ms 
also known as 502478275ns 
which is 0.502478 seconds 
    total time wasted: 2011ms 
     in seconds: 2.01183s 
Verwandte Themen