2011-01-24 32 views
0

私はスレッドを開始するためにThreadPoolを使用しています。内部のthreaadコードでは、実際に使用されている時間のうちに多くのCPU時間を把握しようとしています。私はProcessThreadがあると読んだ。このためのTotalProcessorTimeプロパティ(http://msdn.microsoft.com/en-us/library/system.diagnostics.processthread.totalprocessortime.aspx)が、私はそれを読むことができません。では、現在のスレッドでどうすればよいのですか?現在のスレッドのProcessThread.TotalProcessorTimeを取得する方法

+0

あるので、両方が同じ値を保持している、あなただけの「Iとはどういう意味ですかそれを読むことができません "? –

答えて

2

数poiints:

1)ProcessThreadを経由して、正しいプロセスのスレッドを取得します。 TotalProcessorTimeはネイティブスレッドIDに必要です

2)管理されているスレッドID(Thread.CurrentThread.Name経由)とネイティブスレッドIDを比較して、システム内の現在のスレッドを取得しているようです.Diagnostics名前空間。管理スレッドID!= ProcessThreadIDを忘れないでください。あなたは)スレッドプールのスレッドを再利用することができGetCurrentThreadId機能にhttp://msdn.microsoft.com/en-us/library/ms683183(VS.85).aspx

3を使用する必要がありますので、あなたはそれがスレッドの使用をプロファイリングする場合は、スレッド・プールのTotalProcessorTimeは)あなたが

4を期待しているものよりも大きくすることができますVisual Studio Ultimate、または別の良いプロファイラ(ANTS、DotTrace、SciTech)のスレッドプロファイラを使用する方が簡単かもしれません。

+0

はい、私は間違ったものを比較しているようです。 – ren

3

私は同じことを試みています...どのくらいのCP​​Uが特定のスレッド消費する。次のコードでは、WorkHardが実行されている現在のスレッドを識別できます。 ただし、変数intitialTicksとfinalTicksは、関数を計算するのは難しいの前と後のcurrentProcessThread.TotalProcessorTime.Ticksを持って実行し、その差がゼロ

public void WorkHard() 
    { 
     long initialTicks, finalTicks, deltaTicks; 
     byte f; 
     bool threadFound; 

     ProcessThreadCollection currentProcessThreads; 
     ProcessThread currentProcessThread = null; 

     int m_currentThreadId = kernel32.GetCurrentThreadId(); 

     while (m_keepWorking) 
     { 
      f = (byte)rnd.Next(31); 
      System.Threading.Thread.Sleep(f*25); 
      threadFound = false; 
      currentProcessThreads = Process.GetCurrentProcess().Threads; 

      foreach (ProcessThread t in currentProcessThreads) 
      { 
       if (t.Id == m_currentThreadId) 
       { 
        currentProcessThread = t; 
        threadFound = true; 
        break; 
       } 
      } 

      initialTicks = threadFound ? currentProcessThread.TotalProcessorTime.Ticks : 0; 
      fibonacci(f); 
      finalTicks = threadFound ? currentProcessThread.TotalProcessorTime.Ticks : 0; 
      deltaTicks = finalTicks - initialTicks; 
      lock (workerLogFile.BaseStream) 
      { 
       workerLogFile.WriteLine(string.Concat(m_minionName, " finished calculating fib(", f.ToString(), ") at ", DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss.ffff"), " on threadId[", m_currentThreadId.ToString(), "]. Process required ", finalTicks.ToString()," - ", initialTicks.ToString()," = ", deltaTicks.ToString(), " ticks")); 
      } 

      OnMinionDoneEvent(new minionEventArgs(String.Concat(m_minionName, ", on thread ", m_currentThreadId.ToString("000000"), ", done working on Fibonacci(", f.ToString(), ")"), finalTicks - initialTicks)); 
     } 
     lock (workerLogFile.BaseStream) 
     { 
      workerLogFile.WriteLine(string.Concat(m_minionName, " called to rest at ", DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss.ffff"), " on threadId[", m_currentThreadId.ToString(), "].")); 
     } 
関連する問題