私のプロジェクト(C#、VS2010、.NET 4.0)には、特定のfor
ループが200ミリ秒以内に終了する必要があります。そうでなければ、残りの反復を実行することなくこの期間の後に終了しなければならない。ループは一般にi = 0
〜約500,000〜700,000になりますので、合計ループ時間は変化します。C#の特定の時間の後にループを終了
私は類似して、以下の質問を読みましたが、彼らは私の場合には助けにはならなかった。
- What is the best way to exit out of a loop after an elapsed time of 30ms in C++
- How to execute the loop for specific time
は、これまでのところ私は追跡するStopwatch
オブジェクトを使用して試してみました経過時間がそれは私のために働いていない。
方法1.for
ループ内での経過時間を比較する:ここで私はこれまで試してみました2種類の方法ですif (sw.Elapsed > TimeSpan.FromMilliseconds(200))
が完了するまでに200以上のミリ秒かかるので
Stopwatch sw = new Stopwatch();
sw.Start();
for (i = 0; i < nEntries; i++) // nEntries is typically more than 500,000
{
// Do some stuff
...
...
...
if (sw.Elapsed > TimeSpan.FromMilliseconds(200))
break;
}
sw.Stop();
は、これは動作しません。私の場合は役に立たない。私はTimeSpan.FromMilliseconds()
が一般的にこの時間がかかっているのか、何らかの理由で私のケースに入っているのかどうかはわかりません。
方法2時間を比較するための別のスレッドを作成:
Stopwatch sw = new Stopwatch();
sw.Start();
bool bDoExit = false;
int msLimit = 200;
System.Threading.ThreadPool.QueueUserWorkItem((x) =>
{
while (bDoExit == false)
{
if (sw.Elapsed.Milliseconds > msLimit)
{
bDoExit = true;
sw.Stop();
}
System.Threading.Thread.Sleep(10);
}
});
for (i = 0; i < nEntries; i++) // nEntries is typically more than 500,000
{
// Do some stuff
...
...
...
if (bDoExit == true)
break;
}
sw.Stop();
私はいくつかの統計情報を出力するループ内の他のコードを持っています。方法2の場合、for
ループがすべての反復を完了する前に確実に中断しますが、ループのタイミングはまだ280〜300ミリ秒です。
forループを200ミリ秒以下で厳密に破ることをお勧めしますか?おかげさまで
ループを実行するスレッドを強制終了するのはどうですか?しかし、理想的ではないかもしれません。 –
http://stackoverflow.com/questions/5945533/how-to-execute-the-loop-for-specific-time – akhil
@Filip Ekberg、良い点!それを修正する必要があります。 :)しかし、それは私の問題を解決するのに役立つことはありません。しかし、それはよい練習です。ありがとう。 – silverspoon