4

C#を使用して2つのプロセスを起動するテストを実行しています。プロセスで使用されている最上位のメモリとCPUを取得する必要があります。誰かがマネージコードを使用してそれを行う方法についてのガイドラインを教えてもらえますか?(私はまた、monoを使用してLinux上でそれを実行します)。

アーキテクチャは次のとおりです。

このプロセスは、とtest.exeの2つのプロセスを起動A.exeB.exeます。プロセスAとBの測定最大メモリとCPUを測定する必要があります。test.exe

できますか?前もって感謝します

4

3 に答える 3

8

System.Diagnostics.Processクラスを使用してプロセスを開始できます。次に、、、およびその他のプロパティをチェックしてUserProcessorTime、プロセッサの使用量とメモリの使用量をチェックできます。System.Diagnostics.Processについては、このMSDNの記事を確認してください。TotalProcessorTimePeakWorkingSet64

于 2012-04-16T11:23:50.850 に答える
3

これを使用してみてくださいCPU情報を取得

PerformanceCounter cpuCounter;
PerformanceCounter ramCounter;

cpuCounter = new PerformanceCounter();

cpuCounter.CategoryName = "Processor";
cpuCounter.CounterName = "% Processor Time";
cpuCounter.InstanceName = "_Total";

ramCounter = new PerformanceCounter("Memory", "Available MBytes");


public string getCurrentCpuUsage(){
        return cpuCounter.NextValue()+"%";
}

public string getAvailableRAM(){
        return ramCounter.NextValue()+"MB";
} 

編集: プロセスを開始する前と開始した後に違いを確認できます。

于 2012-04-16T11:26:30.253 に答える
1

またはあなたはこれを試すことができます

private ulong GetCPU(ThreadEntry[] thList) 
{ 
  ulong result = 0; 
  for (int i = 0; i < thList.Length; i++) 
  { 
    ulong NewThC = 0; 
    ulong NewThE = 0; 
    ulong NewThK = 0; 
    ulong NewThU = 0; 
    if(GetThreadTimes(thList[i].ThreadID, ref NewThC, ref NewThE, ref NewThK, ref NewThU)) 
      result = result + NewThK + NewThU; 
    int error = Marshal.GetLastWin32Error(); 
//often ERROR == 6 or ERROR == 18
  } 
  return result; 
} 

//GET ALL PROCESS CPU USAGE 
private void timer1_Tick(object sender, EventArgs e) 
{ 
//reset results 
  this.textBox1.Text = string.Empty; 
//turn of timer 
  this.Enabled = false; 
  uint perm = GetCurrentPermissions();


  //SET PERMISION SO I CAN RECEIVE INFO ABOUT THREADS
  SetProcPermissions(0xFFFFFFFF);


//get all running process (OPENNETCF)       
  List<ProcessEntry> processList = new List<ProcessEntry>(ProcessEntry.GetProcesses()); 

//OLD Variables stored in list 
  if (OldResList == null || (OldResList != null && OldResList.Length !=   processList.Count)) 
    OldResList = new ulong[processList.Count]; 

//SORT by ID only for testing       
  processList.Sort(CompareProcessEntry); 
//GET ALL CPU USAGE       
  for(int i=0;i<processList.Count;i++) 
  { 
  //new value 
    ulong newRes = GetCPU( processList[i].GetThreads() ); 
  //result 
    ulong result = (newRes - OldResList[i]); 
  //valid result 
    result = result / (ulong)this.timer1.Interval; 
  //set result to the thexbox 
    this.textBox1.Text += processList[i].ExeFile + " " +  result.ToString() + " ;"; 
  //change old to new 
    OldResList[i] = newRes; 
  } 
  //sleep 
  Thread.Sleep(1000); 
  SetProcPermissions(0xFFFFFFFF);
  //start again 

  timer1.Enabled = true; 
  } 
  public static int CompareProcessEntry(ProcessEntry p1, ProcessEntry p2) 
  { 
   return p1.ProcessID.CompareTo(p2.ProcessID); 
  } 

  [DllImport("coredll")] 
  private static extern bool GetThreadTimes(uint p, ref ulong NewThC, ref ulong NewThE, ref ulong NewThK, ref ulong NewThU); 
于 2012-04-16T11:47:53.120 に答える