2017-07-10 1 views
1

以下は、実行を中断するためのThread.Sleepを使用する単純なコードと、スレッドが実際にスリープした時間を見つけるためのStopwatch.ElapsedMillisecondsです。VBでThread.Sleepを使用した不思議な動作

Dim sw As New Stopwatch() 
Dim elapsed_ms As Integer = 0 

sw.Start() 
While True 
    Threading.Thread.Sleep(10) 
    elapsed_ms = CInt(sw.ElapsedMilliseconds) 
    Debug.WriteLine("Elapsed: " & elapsed_ms & " ms") 
    sw.Restart() 
End While 

私の質問は:時折、デバッグプリントは0ミリ秒が経過したことを述べています。これはどのように可能ですか?私は、Thread.Sleep(10)が正確ではなく、通常10ミリ秒以上スリープしていることを知っていますが、最低10ミリ秒スリープすることが保証されていると思いました。

+0

'StopWatch'で' Frequency'と 'IsHighResolution'をチェックして、実際に高解像度タイマを持つ' StopWatch'を持っていることを確認してください。 –

+0

頻度は2531513です(これは私が考えると、半マイクロ秒までは正確でなければなりません)。どちらの方法でも、IsHighResolutionフィールドはTrueを読み取ります。 – Cobalt

+0

新しい空のコンソールプロジェクトを作成し、コードに貼り付けることでこれを再現しようとしました。私は0msのラインは見ませんが、9msのラインがたくさん見えますが、私が理解しているところから実際には起こってはいけません。どのOSを使用していますか?これはコード全体ですか? –

答えて

0

私は個人的にはさまざまな理由でThread.Sleepを使用しないようにしていますが、あなたが見ている不規則さはその1つです。

Thread.Sleepを呼び出す代わりに、私はあなたが眠っていたどんな増分のためにも将来のタイムアウトを計算して、何もしないループwhileを使用します。私はあなたが変な行動を見ている理由は、これはThread.Sleepと説明していない。しかし、私はThread.Sleepはマイナス面をたくさん持っているし、かなり回避することができる言及する価値だと思った知って

While True 
    Dim l_TO As Date = Now.AddMilliseconds(10) 
    While l_TO > Now 
     'Do Nothing, 
     'Sometimes I will put a Thread.Sleep call in here but that's usually if the amount of time being waited is more than seconds. 
     'Mainly because a loop of this nature will chew up more processing power than you would expect. 
     Thread.Sleep(1) 'Probably not need because of the short time that you are forcing the program to wait. 
    End While 
    elapsed_ms = CInt(sw.ElapsedMilliseconds) 
    Debug.WriteLine("Elapsed: " & elapsed_ms & " ms") 
    sw.Restart() 
End While 

:だからあなたのメインWhileループは次のようになります。簡単に。

+0

私は日付の使用が好きですが、この方法ではスリープとストップウォッチの方法よりも多くの処理能力を使用しませんか?編集:また、デバッグプリントには一般にどのような価値がありますか? – Cobalt

+0

これは私がコメントで取り上げていたものですが、ループ内に 'Thread.Sleep(1)'を置くことは、処理能力の問題の多くを軽減します。残念ながら、これはあなたが 'Thread.Sleep'に依存していることを意味します。 –

+1

ちょうど簡単なテストをして、9-11ミリ秒が出力ウィンドウに記録されているようです。私はタスクマネージャも監視していました。CPU使用率は実行時間全体で0として記録されていました。最初のロギングライン以外に0msは記録されていませんでしたが、5分のテストアプリでバグと思われました。 –

関連する問題