2008-11-04 5 views
4

В настоящее время я работаю над приложением MFC, которое должно быть доступно для использования в ЦП. Он может иметь несколько потоков в разные моменты времени, но основная часть работы выполняется главным потоком.Win32: вычислить использование процессора потоков в многоядерной/многопроцессорной системе

Я пытаюсь найти способ подсчитать, сколько процентов от процессора используется в этом основном потоке. Тем не менее, я сталкиваюсь с некоторыми проблемами относительно того, как именно это сделать в многопроцессорной/многоядерной среде. Проблема в том, что большинство системных вызовов, похоже, дает системную информацию, тогда как мне нужна информация, специфичная для процессора, на котором выполняется мой основной поток.

Я посмотрел на WMI, но это кажется излишним для задачи. Будет ли GetThreadTimes() работать для того, что мне нужно?

ответ

7

Ваш основной поток может выполняться на разных процессорах в разное время, поэтому «информация, специфичная для процессора, на котором выполняется мой основной поток», может быть бессмысленной - вполне возможно, что все процессоры. Windows не отслеживает, сколько времени поток выполнял на каком-то процессоре, поэтому вы не можете спросить «дайте мне список времени выполнения для этого потока, за процессор». Единственное исключение - когда вы устанавливаете маску аффинности потока для одного процессора - тогда вы можете быть уверены, что если поток выполняется вообще, он работает на этом одном CPU.

Для вычисления времени выполнения GetThreadTimes - это правильный API, да. Если вы хотите, какой процент (теоретически) CPU использует процесс, вычислить

(kerneltime+usertime)/(now - starttime)/numberofcpus 

Эта формула предполагает, конечно, что все процессоры имеют одинаковую скорость. Если вы хотите, чтобы показать то, что CPU часть нить недавно потребляли, образец GetThreadTimes каждый второй, а затем вычислить

(usedtimenow - usedtimeprevious)/(now - previous)/numberofcpus 

Если попробовать каждый второй, теперь предыдущий бы примерно быть 1, но вы должны записывать время выборки , в любом случае - система не может заставить вас спать ровно 1 с между образцами.

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