

プログラムを実行しているとSleep命令で指定した時間と、実際に待機する時間が食い違うケースが発生しています。例えば、
DWORD a = timeGetTime();
Sleep(16);
DWORD b = timeGetTime() - a;
のようなコードを作成した場合、bの値は31となり、予定の2倍近くウェイト処理を行っています。この原因はOSにあるのでしょうか、それともプログラムにあるのでしょうか。
なお、開発環境はWindows Vista Ultimate、Visutal C++ 2005 SP1です。
No.2ベストアンサー
- 回答日時:
ちなみに、timeGetTimeの精度自体が、明示的に設定しないと、
かなり悪い(5ms以上)になる可能性もあるのですが確認していますか。
# 例えば二回のtimeGetTimeが+5ms/-5msずれると計10msズレます。
timeBeginPeriod は使ってますか?
timeBeginPeriodをプログラムに編入したところ、Sleepの待機時間が正確になりました。MSDNのSleep()の項目では一切言及されていなかったので、MrBanさんの回答がなければ解決することはできなかったでしょう。ありがとうございます。
No.1
- 回答日時:
Windowsに限らずLinuxなどでも、マルチタスクな高級OSの多くは時間の保証をしません。
仕様/方式上の問題ですので、アプリでは「ちょうど16ms」の待機は不可能です。
# 日本の電車のダイヤみたいなベストエフォートで、
# 現実的にだいたい16msだとしても、実は混んでれば(重いプログラムが走ってたり)
# 簡単に遅れる可能性があります。
# まともな制御精度も10msとかの世界です(参照はもっと高精度になりますが)。
WindowsAPIにおいても、Sleepで指定できるのは「最低16ms以上待機する」ことだけなので、
それでもかまわないようにソフトは設計されなければなりません。
どうしても16msちょうどにする必要があるなら、理由にもよりますが、
リアルタイムOS(RTOS)と呼ばれるちょっと特殊なOSを使うとか、
Windowsであればドライバを作成するなどの必要性が出てきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
API、OCX、DLLって何でしょう?
-
VBプログラムをEXCEL VBAに移植...
-
ASPとASP.NET両方の...
-
VBS:コンピュータ名を取得し、...
-
地域と言語のオプションをプロ...
-
Java (ジャバ)
-
Cプログラムの解析(関数の呼び...
-
ソフトイーサ開発者(登大遊 氏)...
-
<python> main():関数
-
コンソールアプリでファイル選...
-
1年無職の彼氏 別れるべきですか?
-
iframe の代用で objectタグを...
-
Object Moved This object may ...
-
全豊田作業責任者
-
大学で学んだ専門分野の勉強は...
-
HPの被リンクアドレスを調べたい
-
検索できません
-
javascriptによる文字検索
-
サイト検索時に上位にランクさ...
-
6~7割の正解で、なぜ合格?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
API、OCX、DLLって何でしょう?
-
VBプログラムをEXCEL VBAに移植...
-
SNMPトラップ情報をC#.netで作...
-
LInuxとWindowsでのPerlの動作...
-
コンソールアプリでファイル選...
-
Ryzen 3700(無印)はWin11に対応...
-
C#のプログラムを読むコツって...
-
VB.net エラーメッセージを英文...
-
JOB名とSTEP名の取得方法を教え...
-
UNIX環境でのCプログラム上でC...
-
ショートカットメニュー
-
Xwindow osf/motifのラジオボタン
-
Visual Basic と VC++ のちが...
-
プログラミング言語について御...
-
C言語でプログラムを作りたい
-
超初心者が数値計算のためにC++...
-
Cプログラムの解析(関数の呼び...
-
printf系の書式「w」ってなに?
-
個人プログラミング
-
プログラマの人件費
おすすめ情報