boost::chrono
chrono ライブラリ使えば問題なくミリ秒単位で取得できました。
車輪の再発明もいいところ。
#include <assert.h> #include <boost/chrono.hpp> #include <boost/chrono/timer.hpp> #include <Windows.h> int main(){ namespace chrono = boost::chrono; boost::chrono::timer<> t; Sleep(16); chrono::milliseconds ms = chrono::duration_cast<chrono::milliseconds>(t.elapsed()); // 16ms より短かった場合は適当に四捨五入 ms = chrono::duration_cast<chrono::milliseconds>(ms + chrono::microseconds(500)); assert(ms.count() == 16); return 0; }
timer::elapsed() は、ナノ秒単位が返ってくるのでミリ秒単位にキャストしています。
切り捨て誤差を防止するため自分より大きい単位に代入できないみたい。
どうしてもやりたい時は、chrono::duration_cast を使用して明示的にキャストしてやります。
chrono::microseconds ms(16); chrono::nanoseconds ns = ms; // 小さい単位には代入できるけど chrono::seconds sec1 = ms; // 大きい単位には代入できない // duration_cast を使う chrono::seconds sec2 = chrono::duration_cast<chrono::seconds>(ms);
chrono ライブラリは、デフォルトの boost に入ってないので別途、導入する必要があります。
下記のダウンロードからライブラリを落としてきて、そのまま上書きすれば動きました。
※要コンパイル
[boost]
ver 1.44.0
[chrono]
ver 0.5.0
ダウンロード
[参照]
http://d.hatena.ne.jp/faith_and_brave/20080908/
http://svn.boost.org/svn/boost/sandbox/chrono/libs/chrono/doc/html/index.html