2011-01-24 5 views
0

입니다. ThreadPool을 사용하여 스레드를 시작합니다. threaad 코드 안에는 실제로 사용 된 많은 CPU 시간을 파악하려고합니다. ProcessThread가 있다는 것을 읽었습니다. 이것에 대한 TotalProcessorTime 속성 (http://msdn.microsoft.com/en-us/library/system.diagnostics.processthread.totalprocessortime.aspx)을 읽을 수는 없습니다. 그렇다면 현재 스레드에 대해 어떻게 가져 옵니까?현재 스레드의 ProcessThread.TotalProcessorTime을 얻는 방법은

+0

그래서 모두 같은 값을 유지 나는 단지 그것을 읽을 수 없습니까? " –

답변

2

몇 poiints는 :

1) ProcessThread를 통해 올바른 프로세스 스레드를 얻으려면. TotalProcessorTime 당신이 네이티브 스레드 ID가 필요합니다

2) 시스템을 통해 현재 스레드를 얻기 위해 네이티브 스레드 ID와 관리되는 스레드 ID (Thread.CurrentThread.Name을 통해)를 비교하는 것과 매우 비슷합니다. . 진단 네임 스페이스. 관리되는 스레드 ID! = ProcessThreadID라는 것을 기억하십시오. 당신은 GetCurrentThreadId 기능을 http://msdn.microsoft.com/en-us/library/ms683183(VS.85).aspx

3) 나사) 풀 스레드를 재활용 할 수 있습니다, 그래서 당신은

4

을 기대하고 무엇을 스레드 풀에 대한 TotalProcessorTime보다 클 수 있습니다 당신은 프로파일 링하는 경우 스레드 사용을 사용해야합니다 그것 Visual Studio Ultimate 또는 다른 좋은 프로파일 러 (ANTS, DotTrace, SciTech)에서 스레드 프로파일 러를 사용하는 것이 더 쉬울 수도 있습니다.

+0

네, 잘못된 것의 비교를하고있는 것 같습니다. – ren

3

저는 같은 것을 시도해 왔습니다 ... 얼마나 많은 CPU가 특정 스레드를 수행하는지 알고있게됩니다. 바싹 여위다. 다음 코드에서는 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(), "].")); 
     } 
관련 문제