- ベストアンサー
Sleep命令で指定した待機時間が一致しない
プログラムを実行しているとSleep命令で指定した時間と、実際に待機する時間が食い違うケースが発生しています。例えば、 DWORD a = timeGetTime(); Sleep(16); DWORD b = timeGetTime() - a; のようなコードを作成した場合、bの値は31となり、予定の2倍近くウェイト処理を行っています。この原因はOSにあるのでしょうか、それともプログラムにあるのでしょうか。 なお、開発環境はWindows Vista Ultimate、Visutal C++ 2005 SP1です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ちなみに、timeGetTimeの精度自体が、明示的に設定しないと、 かなり悪い(5ms以上)になる可能性もあるのですが確認していますか。 # 例えば二回のtimeGetTimeが+5ms/-5msずれると計10msズレます。 timeBeginPeriod は使ってますか?
その他の回答 (1)
- MrBan
- ベストアンサー率53% (331/615)
Windowsに限らずLinuxなどでも、マルチタスクな高級OSの多くは時間の保証をしません。 仕様/方式上の問題ですので、アプリでは「ちょうど16ms」の待機は不可能です。 # 日本の電車のダイヤみたいなベストエフォートで、 # 現実的にだいたい16msだとしても、実は混んでれば(重いプログラムが走ってたり) # 簡単に遅れる可能性があります。 # まともな制御精度も10msとかの世界です(参照はもっと高精度になりますが)。 WindowsAPIにおいても、Sleepで指定できるのは「最低16ms以上待機する」ことだけなので、 それでもかまわないようにソフトは設計されなければなりません。 どうしても16msちょうどにする必要があるなら、理由にもよりますが、 リアルタイムOS(RTOS)と呼ばれるちょっと特殊なOSを使うとか、 Windowsであればドライバを作成するなどの必要性が出てきます。
お礼
時間が保証されないというのは初めて知りました。参考になります。
お礼
timeBeginPeriodをプログラムに編入したところ、Sleepの待機時間が正確になりました。MSDNのSleep()の項目では一切言及されていなかったので、MrBanさんの回答がなければ解決することはできなかったでしょう。ありがとうございます。