昨天同屋的兄弟來找我和森哥幫忙,說他的任務的問題,他需要做一個類似任務管理器的東西,能對系統中的進程進行監視,得到內存占用率和cpu占用率,由此來測試公司的某產品和word的性能差別,如啟動時間,內存占用率等。他已經研究了半個月了,關于用c++如何實現,看著那些代碼就頭大,為了快速實現(反正無所謂用什么語言),森哥說,用c#,快!所以我就幫了他忙,查msdn,現寫了一個小程序,作為需求分析吧,鋪好路后就可以任車弛騁了嘛!以下是代碼片斷:
1: private void button1_click(object sender, system.eventargs e)
   2:  {   3:      process.start("winword.exe");4:
5: system.diagnostics.process[] myprocesses;
6: myprocesses =
   7:          system.diagnostics.process.getprocessesbyname("foobar2000");8:
9: string s = myprocesses[0].totalprocessortime.tostring()+"/n";
10: s += myprocesses[0].userprocessortime.tostring()+"/n";
11: s += myprocesses[0].privilegedprocessortime.tostring()+"/n";
12: myprocesses =
  13:          system.diagnostics.process.getprocessesbyname("xdict");14: s += myprocesses[0].totalprocessortime.tostring()+"/n";
15: s += myprocesses[0].userprocessortime.tostring()+"/n";
16: s += myprocesses[0].privilegedprocessortime.tostring()+"/n";
17: s += myprocesses[0].starttime.tostring();
18: messagebox.show(s,"");
19: messagebox(myprocesses.getvalue().tostring());
20: foreach (system.diagnostics.process instance in myprocesses)
  21:      {22: instance.waitforexit(3000);
23: instance.closemainwindow();
24: }
25:
26: }
主要就是用c#準備好的process類,其中有一個方法是start,傳入進程名,就可以啟動某進程,如啟動word,就可以使用第三行那樣的方式。這樣的話,就可以做一個按鈕來觸發某個程序的運行,用starttime來獲取啟動的時間,并且每一秒鐘獲取一次進程的cpu占用(用totalprocessortime這個屬性),用totalprocessortime/1s,這樣就算是cpu占用率/1s,可能會不精確,但是暫時還沒有想到更精確的方式,然后做一個統計,累加時間,直到cpu占用率降到零的時候,停止計時,這樣得到的時間就是程序的大致啟動時間,在理想的狀態下,總比用秒表計時準確吧,公司的某產品用秒表計時還記得過來,可是word 2003一閃而過啊。如果要精確些還可以用比1s更小的單位,精確程度,我想就是執行start和得到starttime之間有指令延時,以及得到cpu總時間和除法花去的時間,這都是造成誤差的時間,但是我想現在cpu速度這么快,總比人用手計時快,有什么更好的方法,還要繼續研究。c#確實,有.net framework給它撐腰,很多事情都不用程序員做了,難以想象c++實現這個的難度,不過,如果能直接得到cpu占用率,豈不更妙?
這個程序稍微完善一下就可以交工了
新聞熱點
疑難解答