質問: MFCで1秒周期で処理を行うプログラムを作成していますが、 標準のタイマーを利用するとほぼ毎秒に10ミリ秒〜15ミリ秒のずれが発生します。 マルチメディアタイマーを利用するとタイマーの精度問題は解決できますか 他のライブラリと相性が悪く他ライブラリがクラッシュしてしまいます。 プロジェクトの関係で他ライブラリは変更できません。 標準のタイマーの精度は上げる方法はありますか? あるいは標準のタイマーのズレを補正する方法はありますか? ご教授よろしくお願いいたします。 -- 2015/02/01 -- 遅くなりましたが、時間がなかったのでとりあえずタイマーのズレを補正する方法で対応しました。 補正の方法としては 最初のマイマーのセットのタイミングで、基準時間と実行回数を設定し、 基準時間より総ずれた時間とズレの平均値を計算し次のタイマーにその分を減算してセットしています。 しばらく動かして見ましたが、ほぼ安定して動作しています。 あとは1日1回基準時間と実行回数を初期化するロジックを追加すれば問題は解決できると思います。
回答: > > 標準のタイマーを利用するとほぼ毎秒に10ミリ秒〜15ミリ秒のずれが発生 > > > Windows OSのシステムクロックは15.6ミリ秒の分解能しかもたないため(Windows 7)、記載のような事象が発生します。高精度タイマが必要な場合は、仰るようにマルチメディアタイマを利用すべきです。 > > 標準のタイマーの精度は上げる方法はありますか? > > あるいは標準のタイマーのズレを補正する方法はありますか? > > > 直接的には不可能かと思われます。ただし、`timeBeginPeriod` 設定の影響をうけて、システム全体のタイマ精度が変化します。他プロセスの動作にも影響を与えるため、その動作が仕様として望ましいか否かは留意してください。 タイマ精度に関しては、Microsoft社から出ている "Timers, Timer Resolution, and Development of Efficient Code"(docx) が詳しいです。 高精度タイマとして、`QueryPerformanceCounter`(QPC) という選択肢もあります。QPCはナノ秒オーダーの分解能を持ちますが、長時間計測に用いると累積誤差がある気がします(これは個人的な経験則ですが...)。また、Windows OS世代や実行環境によって動作が微妙に異なることもあります。 QPCに関する詳細はMSDN "Acquiring high-resolution time stamps" を参照下さい。