2012-01-13 6 views
4

私は2つのスレッド(現在)を持つアプリケーションを持っていますが、Thread.Sleep()関数がうまく動作しないようです。それはスレッドをスリープしますが、それははるかに多くの時間がかかります(例えば、私は5msの間それをスリープ状態にしたい、それは0.3秒以上スリープします)。ここでは、コードは次のとおりです。短時間でThread.Sleepを使用する際の問題

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) ; 

助けてください。

+2

はい、 'Thread.Sleep'は、指定された時間だけ正確にスリープするとは限りません。それを一般的に使用することは、アプリケーションの設計が不適切であるという兆候です。あなたが解決するためにどのような問題を使用しようとしているのかははっきりしていません。失敗した解決策ではなく、*実際の*問題の説明で質問を更新することを検討してください。 –

+0

私はsharppcapとpacketdotnet(DoS攻撃シミュレーション[卒業証書の作業])を持つパケットを大量に送信していると私は、パケットの間に小さな遅延でそれをシミュレートする(遅延なし/ 5msのは.../10msの遅延を遅らせます)。 – matej148

答えて

9

15msはウィンドウ上のスレッドタイムスライスです(実際にウィンドウを混乱させて変更することはできません。物事は早い段階でタイムスライスを与えることができますが、何かがフルタイムスライスを取ることができます。

実際にはそれよりも優れているのは実際には難しく、現実的には20〜30msです。私は50ミリ秒のハードリアルタイムリミットを持っていたリアルタイム処理をしていました。他の人が示されているとして、あなたは、特定のルールに従った場合には(それはC++であった)Windows上でも

+0

これを証明する資料がMSDNにはありますか? – PawanS

+0

これは)Task.Delayのためですが、おそらく同じのThread.sleep ... https://msdn.microsoft.com/en-us/library/hh194845(v=vs.110のために行きます。aspx – user2971569

1

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

+3

私は、ストップウォッチはメディアタイマーと同じように高精度のタイミングを提供することに同意しません。私が知る限り、MediaPerformanceCounterであるメディアタイマーと同じタイマーです。私は、標準的なWindows PC上に他の高解像度タイマーがないことを知っています。 – galford13x

0

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

0

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

4

を働いた、睡眠のデフォルトの解像度は、Windowsのエディションによって、10または15ミリ秒です。

ただし、

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

私たちが出て正確スペースにできること、当社のシリアル通信サービスでこれを行う

timeBeginPeriod(1); 

を発行することにより、1ミリ秒の分解能を使用するようにタイマーを再プログラムすることができます時間内に送信することが重要です。 Windowsではタイマーに基づいた他の処理を頻繁に行うため、これを行うことを嫌う人もいます。現実にはこれはわかりにくい問題ではなく、何百ものシリアルデバイスが接続された何百ものインストールがあります。

+0

専用のマシンでは問題はありませんが、一般的な使用にはほとんどお勧めできません。あなたのインストーラーがそれを私のマシンに行ったことがあれば、私はおそらく郵便に行くでしょう。これまでのところ、タイマーが実際に1ミリ秒の解像度を使用することはありません。 Windowsはまだリアルタイムオペレーティングシステムではありません。 –

+0

これらは専用マシンです。もちろん、これはWindowsがリアルタイムOSではないという事実を変えないということは間違いありません。 –

関連する問題