プロが教えるわが家の防犯対策術!

プログラムを実行しているとSleep命令で指定した時間と、実際に待機する時間が食い違うケースが発生しています。例えば、

DWORD a = timeGetTime();
Sleep(16);
DWORD b = timeGetTime() - a;

のようなコードを作成した場合、bの値は31となり、予定の2倍近くウェイト処理を行っています。この原因はOSにあるのでしょうか、それともプログラムにあるのでしょうか。

なお、開発環境はWindows Vista Ultimate、Visutal C++ 2005 SP1です。

A 回答 (2件)

ちなみに、timeGetTimeの精度自体が、明示的に設定しないと、


かなり悪い(5ms以上)になる可能性もあるのですが確認していますか。
# 例えば二回のtimeGetTimeが+5ms/-5msずれると計10msズレます。
timeBeginPeriod は使ってますか?
    • good
    • 0
この回答へのお礼

timeBeginPeriodをプログラムに編入したところ、Sleepの待機時間が正確になりました。MSDNのSleep()の項目では一切言及されていなかったので、MrBanさんの回答がなければ解決することはできなかったでしょう。ありがとうございます。

お礼日時:2007/07/08 20:54

Windowsに限らずLinuxなどでも、マルチタスクな高級OSの多くは時間の保証をしません。



仕様/方式上の問題ですので、アプリでは「ちょうど16ms」の待機は不可能です。
# 日本の電車のダイヤみたいなベストエフォートで、
# 現実的にだいたい16msだとしても、実は混んでれば(重いプログラムが走ってたり)
# 簡単に遅れる可能性があります。
# まともな制御精度も10msとかの世界です(参照はもっと高精度になりますが)。

WindowsAPIにおいても、Sleepで指定できるのは「最低16ms以上待機する」ことだけなので、
それでもかまわないようにソフトは設計されなければなりません。

どうしても16msちょうどにする必要があるなら、理由にもよりますが、
リアルタイムOS(RTOS)と呼ばれるちょっと特殊なOSを使うとか、
Windowsであればドライバを作成するなどの必要性が出てきます。
    • good
    • 0
この回答へのお礼

時間が保証されないというのは初めて知りました。参考になります。

お礼日時:2007/07/08 20:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!