This issue may occur if the time increment in a program changes and the Hardware Abstraction Layer (HAL) cannot measure the time interval between successive clock interrupts. This causes the system clock to lose a short period of time. When the HAL misses many time-interval measurements in quick succession, the time loss may be significant.また、Multimedia Timerを使用するプロセスがあるとSleep()の精度が変わることがある。これはMultimedia Timerが内部的にtimeBeginPeriod()、timeEndPeriod()を使っているからである。
Note
- This issue may occur on a computer that is running Halaacpi.dll (UP, ACPI, or APIC), Halmacpi.dll (MP, ACPI, or APIC), and Halmps.dll (MP, non-ACPI, or legacy) because these DLLs use the Real Time Clock (RTC) to generate clock interrupts.
- This issue does not occur on a computer that is running Halacpi.dll (UP, ACPI, or PIC) or Halx86.dll (UP, non-ACPI, or legacy) because these DLLs use the 8254 Programmable Interval Timer (PIT) to generate clock interrupts.
参照■[Windows]タイマの精度
CEではなくx86のお話。
もう去年になりますか、客先のプログラムの動作がおかしいということで調べてみると、どうやらタイマの精度が正しくないということがわかりました。
対策を立てるために客先からドライバ開発ベンダーやMSに問い合わせのメールを送るも誤差が生じているなどあまりにも不明瞭な回答が…*1。
こちらでも動かないと埒があかないと思って、問題が発生しているマシンのメーカにも質問を出したら以下のような回答が帰ってきました。
あまりにも他がダメダメだったのでこのサポートの回答には惚れてしまいました。
やはり日本のメーカーだぜとか言いたくもなりますが、ノートPCのようにH/Wの設計をしっかりやっているメーカーはすごいと思わざるをえません。
この動作の原因は、Windows XP のハードウェア アブストラクションレイヤ モジュール:HAL.DLL の仕様の違いによるものであり、そのPCが使用しているHALの種類によってタイマ精度が決まります。
タイマ精度 約 10mS となるマシンは halacpi.dll が使用されており、タイマ精度 16mS となるマシンには halaacpi.dll が使用されております。
最近の機種では、割り込みコントローラに APIC (Advanced PIC) を 使用しておりまして、この場合、HAL は halaacpi.dll が使用されます。
また、比較的古い機種の多くは、割り込みコントローラに PIC (Programmable Interrupt Controller) を使用しておりまして、 この場合、HAL は halacpi.dll が使用されます。
これらの HAL は PC のタイマハードウェアを制御し、 それぞれのタイマ精度の設定値が異なりますため、 ご指摘いただいております現象となります。
以下の2つの操作で、その違いを見分けることができます。
●操作1
Windows\System32 フォルダにございます HAL.DLL のプロパティにて、「正式ファイル名」を参照していただくと、上記のどちらの HAL を使用しているかが分かります。
●操作2
コントロールパネルのシステム アプレットにて、[ハードウェア] タブの[デバイス マネージャ] をクリックし、[コンピュータ] の下に表示されるデバイス名を確認していただきますと、以下のデバイスのどれかが表示されます。
ACPI マルチプロセッサ PC = Halmacpi.dll
ACPI ユニプロセッサ PC = Halaacpi.dll
ACPI (Advanced Configuration and Power Interface) PC = Halacpi.dll
MPS ユニプロセッサ PC = Halapic.dll
Compaq SystemPro マルチプロセッサまたは 100% 互換性がある PC = Halsp.dll