2010-12-04 8 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

Не следует брать 50%, если есть Thread.Sleep? Вы уверены, что это * этот * поток, который занимает все процессорное время? – Kos 2010-12-04 15:44:43

+0

У вас есть только 1 нить? – Codecat 2010-12-04 15:45:44

ответ

2

Похоже, что загрузка процессора происходит из-за воспроизводимого носителя, чем для этого кода.

У вас есть двухъядерный или гиперпотоковый CPU? В этом случае 50% (например, в Perfmon) соответствует одному используемому процессору - это, вероятно, медиаплеер, что означает, что ваш код здесь (по сути) простаивает. Это то, что вы ожидаете, когда вы спите 1 секунду за раз - это вечность в терминах процессора.

Воспроизведение мультимедиа - это очень интенсивный процесс с интенсивным использованием процессора, и вы можете немного уменьшить его, кроме как нажать «Стоп» или «Пауза».

2

Почему бы не использовать Timer для обновления текущего положения и используйте Stopwatch или просто обычный DateTime для измерения прошедшего времени.

Таким образом, у вас нет бесконечной петли в первую очередь.

Смежные вопросы