Tipsこの話は、C#のSystem.Threading.Timerクラスの定周期処理に限ったことではないのですが、タイマーのインターバールに1msを指定したときの実際の実行間隔の話です。Layer)」ドライバに関係していると考えています。HALは周期が16ms(ハードによっては10msとかもある)となっていて、その仕組み上に乗っている(と思われる)C#のタイマーの精度は前述の数値に依存するかなと。従って、タイトルの1msを指定した場合、割り込み周期に同期して1msのタイマーは発生せず、16msでタイマーが発生すると仮定し、これが本当に正しいかを確認します。上記過程を検証するための、1ミリ秒のタイマー実行要求を100回繰り返すコードを書いてみました。sw.Start();}実行結果ですが、概ね16msで実行されて、たまに14msで実行されます。発展させて、じゃあ16ミリ秒以上を指定したらどうなるんだという問題です。32msを指定しました。こんな感じに、めちゃくちゃになります。何回に1回かはジャストで発生しますが、大体、次の割り込み周期に回されて32+16ms近辺で発生します。31msを指定した場合こんな感じになります。今度はかなり希望に近い結果が出ました。いうわけでこの記事を書いているPCのタイマーの精度は16msだったという事が分かったので、確認結果をまとめると1ms周期のタイマーは発生しない16ms以下、10ms以下のタイマーは(HAL的に?)無理(と思われる)発生周期は割り込み周期の倍数で発生する(可能性が高い)次回割り込みに回されると+割り込み周期の誤差が発生する今回の場合16ミリ秒(程度)、後で実行される可能性がある.NETのコード読んでないので推測だらけになってしまいましたが(いや、軽く読んだのですが)、少なくとも検証した環境でTimerを使った場合、正しく精度が高いタイマー動作を期待してプログラムを書いてはいけないという事が分かりました。»Profile受託ソフト会社員でWin系業務屋。趣味でCocos2d-x/C++を触っています。etc...主に受託・開発ネタ、Windowsの事、Srellaris、ゲーム制作の進捗の事を喋ります。Core3.xとUnityでAES暗号化を利用するC#の標準機能でデータを圧縮・展開するC#で属性を利用して処理に制約の説明を追加するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。