5

私は 2 つのスレッド (現在) を持つアプリを持っていますが、関数 Thread.Sleep() がうまく機能していないようです。スレッドをスリープさせますが、はるかに時間がかかります (たとえば、5 ミリ秒スリープさせたいのに、0.3 秒以上スリープさせます)。コードは次のとおりです。

int vlakien = 2;
Thread[] vlakna; 
vlakna = new Thread[vlakien];

for (int i = 0; i < vlakien; i++) 
{ try { vlakna[i] = new Thread(new ThreadStart(utok)); vlakna[i].Start(); } }

private void utok()
{
  //some code
  Thread.Sleep(5);
  //some code
}

また、関数 utok でストップウォッチを使用してスリープさせようとしましたが、さらに時間がかかります。

Stopwatch SW = new Stopwatch(); SW.Start();
while(SW.ElapsedMilliseconds < 5000) ;

助けてください。

4

5 に答える 5

9

15 ミリ秒は、Windows のスレッド タイム スライスです (実際には、ウィンドウをいじって変更することができます.... まったくお勧めしません)。物事はタイム スライスを早めに与えることができますが、すべてのタイム スライスが使用される可能性があります。

したがって、それよりも優れたものにするのは非常に難しく、実際には、現実的には 20 ミリ秒または 30 ミリ秒である可能性が高くなります。以前は、50 ミリ秒という厳しいリアルタイム制限のあるリアルタイム処理を行っていました。特定のルールに従えば、Windowsでうまく機能しました(C ++でした)

于 2012-01-13T01:33:54.397 に答える
5

他の人が示しているように、スリープのデフォルトの解像度は、Windows のエディションに応じて 10 または 15 ミリ秒です。

ただし、タイマーを再プログラムして、1 ミリ秒の分解能を使用することができます。

timeBeginPeriod(1);
timeEndPeriod(1);

どこ

[DllImport(WINMM)]
internal static extern uint timeBeginPeriod(uint period);   

これは、正確な時間間隔で送信できることが重要なシリアル通信サービスで行われます。Windows がタイマーに基づいた他のことをより頻繁に実行するようになるため、これを行うことに消極的な人もいます。実際には、これによって認識できる問題は発生しておらず、何百ものシリアル デバイスが接続された何百ものインストールがあります。

于 2012-01-13T02:04:24.047 に答える
1

Microsoft C# のスリープは、最小限の時間を保証します。5ミリ秒未満のスリープは間違いなく問題です。また、ストップウォッチは非常に正確な測定ではない場合があります。高精度のメディア タイマーを試してください。

于 2012-01-13T01:28:14.943 に答える
0

システムクロックの分解能に影響されます。それは約15msです...システムクロックの分解能を下回ることはできません。このリンクを見てください (これは C++ ですが、タイマーの解像度についてのアイデアが得られます)。

于 2012-01-13T01:29:37.503 に答える
0

Thread.Sleep に渡されるパラメータは、正確な時間ではなく、最小スリープ時間です。

于 2012-01-13T01:31:50.543 に答える