2010-12-04 9 views
2

私は新しいスレッドを作成します。ここにはスレッドメソッドコードがあります:スレッドの無限ループ中にプロセッサの使用量を減らすにはどうすればよいですか?

while (true) 
{ 
    if (!showHelp) 
    { 
     Console.Clear(); 
     Console.WriteLine("=============================================="); 
     Console.WriteLine(player.PlayList.CurrentTrack().Artist + " " 
          + player.PlayList.CurrentTrack().Title + " " 
          + player.PlayList.CurrentTrack().Genre.ToString()); 
     Console.WriteLine(" [ " + pos.Duration() + "/" 
          + player.PlayList.CurrentTrack().Length + " ] "); 
     Console.WriteLine("==============================================="); 
    } 

    Thread.Sleep(1000); 

    if (isPlaying) 
     pos += TimeSpan.FromSeconds(1); 

    if (pos > player.PlayList.CurrentTrack().Length) 
    { 
     pos = TimeSpan.Zero; 
     player.Next(); 
    } 
} 

コンソールで現在のトラック位置を変更したいと思います。私は1秒間スリープし、1秒間追加します。

私はそれを無限ループで行い、プロセッサは50%の負荷の下にあるようです。

ループの繰り返しの間にプロセッサにかかる負荷を軽減するにはどうすればよいですか?

+4

Thread.Sleepがある場合、50%を取るべきではありませんか?すべてのCPU時間を要する* this *スレッドだと確信していますか? – Kos

+0

スレッドが1つしかありませんか? – Codecat

+0

プロセッサをアンロードするとどういう意味ですか? (たぶんあなたの質問を編集し、それを言い換えることができます) – gideon

答えて

2

CPU負荷がこのコードよりも再生されているメディアに起因する可能性が高いようです。

デュアルコアまたはハイパースレッドCPUをお持ちですか?その場合、50%(Perfmonなど)は、1つのCPUが完全に使用されていることに対応します。これはメディアプレイヤーの可能性が高いため、ここでコードが(本質的に)アイドルであることを意味します。これは、一度に1秒間スリープ状態になると期待されるものです。これはCPUの永遠性です。

メディア再生はCPUを大量に消費するプロセスであり、「停止」または「一時停止」以外のヒットを軽減することはあまりありません。

+0

あなたが正しいかもしれません。私はmsiSendStringを使ってオーディオを再生します。 – Sergey

+2

この仮説を確認するためにPerfMonからスレッドレベルのCPUデータを取得できます。この状態のプロセス内のスレッドのスレッドIDとCPUを調べ、デバッガに表示されているスレッドIDと相関させるか(または上記のログ出力にスレッドIDを追加して、メディア再生と同様のスレッドID出力を行う糸)。 –

2

Timerを使用して現在の位置を更新し、Stopwatchまたは通常のDateTimeを使用して経過時間を測定してみませんか?

このようにすれば、最初は無限ループになることはありません。

関連する問題