2015-10-20 4 views
0

Я пытаюсь написать программу, в которой регистрируется использование ЦП & процесса, который потребляет самый высокий процессор. Предположим, что firefox.exe занимает максимальный процессор, то есть 70%, он должен регистрировать только этот процесс с использованием процессора.Получить процесс с самым высоким использованием ЦП

Я использую библиотеку сигара для выполнения этой задачи. Вот мой текущий код, который получает системное использование ЦП каждую секунду.

public class CPULogger { 

    private static Sigar sigar = new Sigar(); 
    public void startLogging() 
    { 
     Mem mem = null; 
     CpuTimer cpuTimer = null; 
     CpuPerc cpuPerc = null; 
     FileSystemUsage fileSystemUsage = null; 
     int num = 0; 
     try 
     { 
      System.load(System.getProperty("user.dir") + "\\sigar-x86-winnt.dll"); 
     } 
     catch(Exception exc) 
     { 
      writeLogs(exc.getMessage()); 
     } 

     while(true) 
     { 
      try 
      { 
       Thread.sleep(1000); 

       cpuPerc = sigar.getCpuPerc(); 
       num = (int)Math.ceil(cpuPerc.getCombined()*100); 

       writeLogs(Double.toString(num).split("\\.")[0] + " %" + (num >= 90 ? "\tAlert" : "")); 
      } 
      catch(Exception e) 
      { 
       writeLogs(e.getMessage()); 
      } 
     } 
    } 
    public void writeLogs(String logDesc) 
    { 
     try 
     { 
      PrintWriter writer; 
      writer = new PrintWriter(new BufferedWriter(new FileWriter("Logs.txt", true))); 
      writer.println(new java.util.Date() + "\t" + logDesc); 
      writer.close(); 
     } 
     catch(IOException e) 
     {} 
     catch(Exception e) 
     { 

     } 
    } 

    public static void main(String[] args) { 

     CPULogger ul = new CPULogger(); 
     ul.startLogging(); 
    } 

} 

Как я могу заставить его регистрировать процесс с самым высоким ЦП?

ответ

1

ИМО вы можете использовать следующий код, чтобы получить список всех процессов:

final Sigar sigar = new Sigar();   
    final long[] processes; 
    try { 
     processes = sigar.getProcList(); 
    } catch (Exception e) { 
     //throw exception. 
    } 

Затем вы можете перебрать все процессы и получить использование процессора для каждого процесса:

for (final long processId : processes) { 
     try { 
      ProcCpu procCpu = sigar.getProcCpu(processId); 
      // compare and set max value. 
     } catch (SigarException e) { 
      //In case for some pid access is denied. 
     } 

} 

Тогда вы можете зарегистрировать это значение max. Вы также можете проверить это link для некоторых примеров программ.

+0

'sigar.getProcCpu (processId);' не показывает правильное использование ЦП. Он всегда показывает меньше нуля, даже если некоторый процесс достигнут 5-10. –

+0

Проверьте это: http://stackoverflow.com/questions/19323364/using-sigar-api-to-get-jvm-cpu-usage –

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

  • Нет связанных вопросов^_^