• 締切済み

【C#】指定したミリ秒の時に正確に実行する

指定したミリ秒の時に正確に実行するようにするにはどうのようにすればいいでしょうか? つまりDateTime.Nowを実行した時、Millisecondが指定した数になる方法を探しています

みんなの回答

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

計測か何かでしょうか? 計測の場合精度の問題がでるので時間精度に関わる所は外部の計測機器・マイコンなどで処理した上で、PCではロギングに徹するなどの対策が必要になります。 あるいは既に書かれているリアルタイムOSに切り替えるかです。その場合C#が使えない可能性が高いです。

at_key
質問者

補足

回答ありがとうございます。 時間はC#のSystem.DateTime.Nowで問題ありません。 下の通り自己解決しました。

すると、全ての回答が全文表示されます。
回答No.2

基本的にWindowsOSでは正確な時間制御を行うことは不可能です。 OSには、リアルタイムOSとイベントドリブンOSがあります。 前者は、主に組み込み系OSで使われていて、時間資源の優先度に力を入れており、より高精度な時間指定ができます。 後者は、WindowsOS等で使われていて、マウス・キーボード、ほか全ての処理がMessageキューという場所に蓄積され、キューに蓄積された順番に処理を行うので、遅延が発生します。 今どのような方法で時間を計測しているのかわかりませんが、 http://dobon.net/vb/dotnet/system/stopwatch.html このリンク先で紹介しているstopwatchクラスやWindowsAPIを使ってみてはどうでしょうか? System.Timers.Timer System.Threading.Time System.Windows.Forms.Timer よりは高精度な値が得られると思います。 が、最初に書いた通り、OSの仕組みとして多少遅延が発生します。 参考になりましたでしょうか?

at_key
質問者

補足

回答ありがとうございます。 すいません、説明不足でした。必要な精度はミリ秒まで合えば良い程度です。 無理矢理ですが以下のコードで出来ました。 //ミリ秒がiMS付近になるまで待つ int iMS = 500; const double waitMS = 0.5; TimeSpan wait = TimeSpan.FromMilliseconds(waitMS); int num = 0;DateTime t = null; for (int i = (int)(5000.0 / waitMS); i > 0; i--) { t = DateTime.Now; num = Mod(iMS - DTPost.Millisecond, 1000); if (0 <= num && num <= 2) break; Thread.Sleep(wait); } Console.WriteLine(t.Millisecond);

すると、全ての回答が全文表示されます。
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

どうやろうが必ず誤差は乗るので、不可能ってのが答えになります。

at_key
質問者

補足

すいません…説明不足です マイクロ秒はどうでもよくてミリ秒が合えば良い程度です 下の補足の通り自己解決しました。

すると、全ての回答が全文表示されます。

関連するQ&A