0

ストップウォッチ クラスの使用を組み込んだアプリケーションを作成しようとしています。

Stopwatch sw = new Stopwatch();
sw.Start();
while (play)
{
    long timer = sw.ElapsedMilliseconds;
    Debug.WriteLine(timer);
}

このループをテストして経過時間を確認したところ、プログラムに数ミリ秒の欠落があることがわかりました。

デバッガー出力からのクロッキング:

31
32
33
34
35
36
37
38
40 <------39 逃した
41
42
43

この問題を解決する方法について何か提案はありますか?

4

3 に答える 3

5

失われているミリ秒は、プログラムが OS 上で実行されている唯一のものではないという事実によるものです。

そのため、ときどき他のプログラムがタイム スライスを取得し、数ミリ秒が取り残されます。

それを「修正」することはできません。

于 2011-01-30T23:01:35.637 に答える
5

ミリ秒がありませんか?1 秒間に 1 ミリ秒刻みごとにエントリが表示されることを期待していますか? たとえば、1秒あたり1000?もしそうなら、それは決して起こりません。1 ミリ秒まで正確なタイミング API はありません。

タスク切り替えなどの他のオペレーティング システム プロセスに加えて、ミリ秒データを出力しているループで割り当てとストリーム出力を行っているという事実は、ミリ秒の精度が不可能であることを意味します。探している種類の出力を実現するには、専用のリアルタイム マシンが必要です。

于 2011-01-30T23:03:35.773 に答える
0

Debug.WriteLine は 1 ミリ秒よりも遅くなる可能性があります。速度のために最適化されていません。

メッセージをリストに配置する呼び出しを追加し、実行後にリストを Debug.WriteLine に書き込むことができます。メッセージを Debug.WriteLine に送信するバックグラウンド タスクを追加できます。

どちらも、タイマーの目盛りが失われないようにする必要があります。

目盛りが失われるもう 1 つの理由は、OS または 2 つの Debug.WriteLine 呼び出しの間に何らかの作業を行っている別のプログラムである可能性があります。遅いマシンかもしれません。

スレッドの優先順位を設定するか、専用マシンでこのアプリケーションを実行すると解決するはずですが、Windows ではリアルタイム OS とは言われていないため、この種のタイマーの問題が予想されます。

于 2013-06-05T06:44:57.233 に答える