描述 為了監控windows下進程佔用資源(記憶體、cpu使用率)的情況,在這裡使用C#自製一個小工具。比如:在Window下,做某種效能測試時,需要監控進程記憶體和cpu的使用方式;雖然,監控的方法很多,一般都只能看到進程佔用資源的趨勢,無法擷取準確的資料,以便比較。比如:監控某進程時,讓工具每秒記錄一次進程記憶體和cpu的使用率,監控結束時,將這些資料輸出。 這裡自製該工具分成三步:Windows下進程擷取、CPU使用率演算法 和 監控資料輸出。
擷取進程
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Diagnostics;using System.IO;using System.Threading;namespace ProcessMonitor{ public partial class Form1 : Form { /** * 初始化視窗。 */ public Form1() { InitializeComponent(); //設定listView中的三個欄位標題。 listView1.Columns.Add("ProcessId",80); listView1.Columns.Add("ProcessName", 100); listView1.Columns.Add("StartTime", 170); //顯示矩陣的線條。 listView1.GridLines = true; //顯示試圖細節。 listView1.View = View.Details; //試圖的行,可被選中。 listView1.FullRowSelect = true; //擷取當前所有進程。 Process[] processes = Process.GetProcesses(); foreach (Process p in processes) { //擷取每個進程的三個需要顯示到視窗中的屬性。 string processId = p.Id.ToString(); string processName = p.ProcessName; string startTime = ""; //有的進程開始時間無法擷取,則設定為其異常資訊。 try { startTime = getStartTime(p.StartTime); } catch (Exception ex) { startTime = ex.Message; } //將三個屬性,加入顯示列表中。 ListViewItem item = new ListViewItem(new string[] { processId, processName,startTime}); listView1.Items.Add(item); } } /** * 將日曆型時間轉化為字串型時間,方便顯示。 */ private string getStartTime(DateTime dateTime) { string startTime = null; string year = dateTime.Year.ToString(); string month = dateTime.Month.ToString(); string day = dateTime.Day.ToString(); string hour = dateTime.Hour.ToString(); string minute = dateTime.Minute.ToString(); string second = dateTime.Second.ToString(); startTime = year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second; return startTime; } /** * 視窗的update按鈕,重新整理視窗中顯示的進程。 */ private void button1_Click(object sender, EventArgs e) { //重新整理前,清空所有內容。 listView1.Items.Clear(); //擷取當前所有進程。 Process[] processes = Process.GetProcesses(); foreach (Process p in processes) { //擷取每個進程的三個需要顯示到視窗中的屬性。 string processId = p.Id.ToString(); string processName = p.ProcessName; //有的進程開始時間無法擷取,則設定為其異常資訊。 string startTime = null; try { startTime = getStartTime(p.StartTime); } catch (Exception ex) { startTime = ex.Message; } //將三個屬性,加入顯示列表中。 ListViewItem item = new ListViewItem(new string[] { processId, processName, startTime }); listView1.Items.Add(item); } } }}
視窗效果