Millisekunden ermitteln
-
Ups, ich meinte eigentlich eher sowas:
std::time_t zeitpunkt = std::chrono::system_clock::to_time_t();
-
sfdfds schrieb:
Aber dann habe ich keine Millisekunden?
Stimmt, übersehen. Das geht selbstverständlich, aber ich hab noch nicht genug mit chrono gemacht. Jemand anders wird gleich ne Lösung finden.
-
mit
cout << boost::chrono::high_resolution_clock::now();
bekomme ich die Nanosekunden seit dem Start. D.h. man müsste den Computerstartzeitpunkt absolut kennen.
-
Das geht mit Standardmitteln nicht. Du wirst das Betriebssystem bemühen müssen. Es gibt auch einen Grund, dafür: Computeruhren messen die aktuelle Tageszeit einfach nicht so genau. Sonst wären Computer die meiste Zeit damit beschäftigt, die Uhr zu stellen.
Eine Betriebssystemfunktion (wie z.B. gettimeofday in Linux) gibt dir daher vielleicht einen mikrosekundengenauen Wert, aber der wird dann auch nur alle paar zehntausend Mikrosekunden aktualisiert, so dass du auch nicht viel weiter kommst als mit time().
Und noch einen tieferen Grund gibt es: Wen interessiert die Uhrzeit auf Millisekunden genau? Niemanden. Gehe ich Recht in der Annahme, dass du in Wahrheit Zeitabstände messen willst? Das ist nämlich eine sehr häufig benötigte Funktion und daher gibt es dafür auch sehr präzise Uhren im Computer. Insbesondere zur Messung der Laufzeit von Programmen oder Programmteilen. Und da ist chrono dann auch der richtige Weg. Wobei: Wenn du die Laufzeit deines eigenen Programms messen möchtest: Programmier das nicht selber. Das gibt es alles fertig und besser.
-
Eigentlich nicht@Zeitabstände. Aber wie würde ich das tun?
-
Bzw: Wie wandle ich ein "boost::chrono::steady_clock::duration" in Minuten/Sekunden/Millisekunden um?
-
dsffsd schrieb:
Bzw: Wie wandle ich ein "boost::chrono::steady_clock::duration" in Minuten/Sekunden/Millisekunden um?
sfdfds schrieb:
Eigentlich nicht@Zeitabstände. Aber wie würde ich das tun?
Ja was denn nun? Zeitabstände oder nicht?
Die boost::chrono-Sachen sind direkte Vorbilder für die chrono-Funktionen aus C++11. Benutzung ist daher weitestgehend gleich:
http://en.cppreference.com/w/cpp/chrono/duration
-
dsffsd schrieb:
Bzw: Wie wandle ich ein "boost::chrono::steady_clock::duration" in Minuten/Sekunden/Millisekunden um?
Das ist nur ein Klassentemplate, und auch nicht was du willst.
Was interessant wäre, ist vielleichtchrono::steady_clock::period
, denn das gibt an, wieviele Ticks pro Sekunde vergehen. Beihigh_resolution_clock
sind das bspw. dann 1000000000 (Eine Milliarde).Aber das ist nicht was du willst.
Ich glaube, du willst einfach die Uhrzeit auf die Millisekunde genau wissen?
-
Für die Refernz:
boost::chrono::steady_clock::duration duration = boost::chrono::high_resolution_clock::now() - start; mFile << " " << std::setw(2) << std::setfill('0') << boost::chrono::duration_cast<boost::chrono::hours>(duration).count() << ":" << std::setw(2) << std::setfill('0') << boost::chrono::duration_cast<boost::chrono::minutes>(duration).count() << ":" << std::setw(2) << std::setfill('0') << boost::chrono::duration_cast<boost::chrono::seconds>(duration).count() << ":" << std::setw(2) << std::setfill('0') << boost::chrono::duration_cast<boost::chrono::milliseconds>(duration).count();
-
Korrektur
<< ":" << std::setw(3) << std::setfill('0') << boost::chrono::duration_cast<boost::chrono::milliseconds>(duration).count() % 1000;
-
So kriegst du schon mal den aktuellen Millisekunden-Stand heraus:
#include <iostream> #include <chrono> int main() { using namespace std::chrono; high_resolution_clock h; std::cout << static_cast<unsigned>((h.now() - system_clock::from_time_t(system_clock::to_time_t(h.now()))).count() * static_cast<float>(1000) / high_resolution_clock::period::den); }
Ist also zwischen 0 und 999. Nimmst du dann per
to_time_t
die Sekunden, Minuten, usw. dann hast du alles
-
Danke dir
-
dsffsd schrieb:
Danke dir
Ich mach es übrigens umständlich. Ich seh gleich, ob es nicht einfacher geht (was es bestimmt tut).
-
Ja, so geht es einfacher:
std::cout << static_cast<unsigned>((h.now() - std::chrono::time_point_cast<std::chrono::seconds>(h.now())).count() * static_cast<float>(1000) / high_resolution_clock::period::den);
-
Sone_logoff schrieb:
Ja, so geht es einfacher:
std::cout << static_cast<unsigned>((h.now() - std::chrono::time_point_cast<std::chrono::seconds>(h.now())).count() * static_cast<float>(1000) / high_resolution_clock::period::den);
Besser ist vielleicht, die 1000 durch milliseconds::period::den zu ersetzen, ich hab außerdem vergessen, dass ich den Namensraum freigegeben hab', also so:
std::cout << static_cast<unsigned>((h.now() - time_point_cast<seconds>(h.now())).count() * static_cast<float>(milliseconds::period::den) / high_resolution_clock::period::den);