2015年3月29日 星期日

[Java] DIY 一個mac CPU使用率圖形

Mac OS 有一個指令,叫做  iostat ,它可以顯示硬體資訊,例如我輸入 iostat









會出現硬碟、CPU 等使用率資訊,us指的是使用者耗用的CPU使用率, sy是作業系統本身耗

用CPU使用率,id則為idle的意思,表示閒置的CPU使用率,例如本例 100- 6 -4 = 90 。

中途施工時發現一個問題,也就是mac的disk數量會變動,第1個disk0為硬碟,但disk1有可

能是安裝程式產生出來的一個disk,或是隨身碟。










這個程式會利用到iostat 的一個參數 -w ,它可以在每次執行iostat 後,間隔指定的時間,再

輸出一次資料,直到永遠(除非你去取消它)。

這程式中用到了

iostat -w 1 ,表示每隔一秒會輸出一次資訊。

接下來是要用來繪圖用的一個JComponent 程式碼,透過

overwrite  paintComponent  的方式來繪製元件的內容。

 
package javamaccpu_useage;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JComponent;

/**
 *
 * @author flowercatswets
 */
public class DrawPanel extends JComponent
{
    int useage[]=new int[100];
    int shift=30;
    @Override
    public void paintComponent(Graphics g) {
   super.paintComponent(g);
   g.clipRect(0, 0, 120, 400);
   g.setColor(Color.black);
   //黑底   
   g.fillRect(shift, 0, shift+100, 100);
   //畫白橫格線
   g.setColor(Color.white);
   for (int i=20;i<=100;i=i+20)
   {
       g.drawLine(shift, i, 100+shift, i);
   }
   //畫白垂直格線
   for (int i=20;i<=100;i=i+20)
   {
       g.drawLine(shift+i, 0, shift+i, 100);
   }
    //畫上數值20  40 60 80 100
    g.setColor(Color.black);  
   for (int i=100;i>=20;i=i-20)
   {
       g.drawString(String.valueOf(100-i), 0, i);
   } 
   //畫上CPU使用率 
   g.setColor(Color.GREEN);   
   for (int i=0;i




然候是主程式
 
package javamaccpu_useage;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import javax.swing.JFrame;

/**
 *
 * @author flowercatswets
 */
public class JavaMacCPU_Useage {

    
    public static void main(String[] args) {
        //Init Class
       JavaMacCPU_Useage cpu=new JavaMacCPU_Useage(); 
       
       //Init JFrame
       JFrame JF=new JFrame("Mac CPU");
       JF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       JFrame.setDefaultLookAndFeelDecorated(true);
       JF.setBounds(100, 100, 150, 150);
       //JF.pack();
       JF.setVisible(true);
       
       //InitDrawPanel
       DrawPanel dp=new DrawPanel();
       
       //Add JPanel to JFrame
       JF.getContentPane().add(dp);
       //Set DrawPanel Size
       dp.setBounds(0,0, 120, 120);
       //Excute 
       cpu.executeShell(dp,JF);
       
       
    }
    
    public void executeShell(DrawPanel dp,JFrame JF)
    {     
        //Init Process
        Process p;
        //Init CPU Useage array
        int[] useage=new int[100];;
        //command 
        String command="iostat -w 1";
        try
        {
         //run command
         p= Runtime.getRuntime().exec(command);
         //get Process input
         BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream()));
         //Init 
         String line="";        
         int totaluse;
         int offset = 0;
         //get inpurt data
         while((line=reader.readLine())!=null)
         {
             try
             {
                //  disk0           disk1       cpu     load average
                //      or 
                //   KB/t tps  MB/s     KB/t tps  MB/s  us sy id   1m   5m   15m
               if (line.contains("cpu") || line.contains("us"))
               {
                   //disk0           disk1       cpu     load average
                  if (line.contains("cpu"))
                  {
                       offset=findCPU_offset(line);
                  }
                  continue;
              }
              //get cpu data offset success 
              if (offset>0)
                totaluse=getCPU(line,offset);
              //get cpu data offset fail 
              else
                totaluse=0;
             //new data in the last of array
              useage[(useage.length-1)]=totaluse;
              //set data to draw              
              dp.setData(useage);
              //offset data to left postion
              for (int i=1;i<99;i++)
                 useage[i]=useage[i+1];
              //repant 
             JF.repaint();
             
             }
             catch(Exception e)
             {
                 e.printStackTrace();
             }
         }
        }
        catch(Exception e)
        {
        }
    }
    //取得CPU的資訊
    private int getCPU(String line,int offset)
    {
        int count=0;
        double us=0;
        double sys=0;
        
        String tmp[]=line.split(" ");
        for (String tmp1 : tmp) {
            if (tmp1.trim().length() > 0) {
                count++;
                if (count==(offset*3)+1) {
                    us = Double.parseDouble(tmp1);
                } else if (count==(offset*3)+2) {
                    sys = Double.parseDouble(tmp1);
                    break;
                }
            }
        }        
        return (int)(us+sys);        
    }
    
    //判斷CPU 的資訊在第幾個位置
    private int findCPU_offset(String line)
    {
        int count=0;
        int offset=0;
        
        String tmp[]=line.split(" ");
        for (String tmp1 : tmp) {
            if (tmp1.trim().length() > 0) {
                count++;
                if (tmp1.equals("cpu")) {
                    offset=count-1;
                }                
            }
        }        
        return offset; 
    }
    
    
}


接下來是執行結果截圖





沒有留言:

張貼留言