4年に一度のスポーツの祭典 全競技速報中

指定したミリ秒の時に正確に実行するようにするにはどうのようにすればいいでしょうか?

つまりDateTime.Nowを実行した時、Millisecondが指定した数になる方法を探しています

gooドクター

A 回答 (3件)

計測か何かでしょうか?


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

この回答への補足

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

補足日時:2014/03/13 20:31
    • good
    • 0

基本的に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の仕組みとして多少遅延が発生します。

参考になりましたでしょうか?

この回答への補足

回答ありがとうございます。
すいません、説明不足でした。必要な精度はミリ秒まで合えば良い程度です。
無理矢理ですが以下のコードで出来ました。

//ミリ秒が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);

補足日時:2014/03/13 20:27
    • good
    • 0

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

この回答への補足

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

補足日時:2014/03/13 20:30
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング