2009-06-01 10 views
13

मुझे पता है कि प्रक्रिया के लिए सीपीयू उपयोग और मेमोरी उपयोग कैसे प्राप्त करें, लेकिन मैं सोच रहा था कि इसे प्रति-थ्रेड स्तर पर कैसे प्राप्त किया जाए। यदि सबसे अच्छा समाधान कुछ पी-इनवोकिंग करना है, तो यह भी ठीक है।मैं सी # उपयोग (/ प्रबंधित कोड) में * THREAD * के CPU उपयोग और/या रैम उपयोग कैसे प्राप्त कर सकता हूं?

मैं क्या जरूरत का उदाहरण:

Thread myThread = Thread.CurrentThread; 

// some time later in some other function... 

Console.WriteLine(GetThreadSpecificCpuUsage(myThread)); 

उत्तर

3

यहाँ एक उदाहरण है जो आप क्या चाहते हैं http://www.codeproject.com/KB/system/processescpuusage.aspx

+0

यह उतना करीब है जितना मुझे लगता है कि हम प्राप्त करने जा रहे हैं ... धन्यवाद! –

+0

लिंक अब काम नहीं करता –

7

आप धागा प्रति स्मृति उपयोग नहीं कर सकते हैं क्योंकि स्मृति एक प्रक्रिया में सभी धागे के बीच साझा किया जाता है करता है । ओएस कैसे पता चलेगा कि आपने एक थ्रेड में मेमोरी आवंटित की है और इसे दूसरे में इस्तेमाल किया है। और इसका क्या मतलब होगा?

+0

धागा-स्थानीय भंडारण है। – CesarGon

+0

लेकिन आमतौर पर टीएलएस केवल साझा स्मृति में किसी ऑब्जेक्ट का संदर्भ रखने के लिए उपयोग किया जाता है। – erikkallen

+0

यह ओएस नहीं है जिसे थ्रेड के उपयोग को निर्धारित करना है, ढांचा ही है। –

10

के रूप में कहा, स्मृति उपयोग का उत्तर नहीं दिया जा सकता है के बाद से है कि एक पूरे के रूप में इस प्रक्रिया की एक विशेषता है, लेकिन CPU उपयोग:

Process p = Process.GetCurrentProcess(); // getting current running process of the app 
foreach (ProcessThread pt in p.Threads) 
{ 
    // use pt.Id/pt.TotalProcessorTime/pt.UserProcessorTime/pt.PrivilegedProcessorTime 
} 
1

यहाँ एक सरल कार्यक्रम है कि 5 धागे कि CPU के विभिन्न मात्रा में उपभोग की शुरूआत है और तब मेल खाता है कि प्रबंधित थ्रेड कितना सीपीयू उपभोग कर रहा है।

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Threading; 

class Program 
{ 
[DllImport("Kernel32", EntryPoint = "GetCurrentThreadId", ExactSpelling = true)] 
public static extern Int32 GetCurrentWin32ThreadId(); 

static void Main(string[] args) 
{ 
    Dictionary<int, Thread> threads = new Dictionary<int, Thread>(); 

    // Launch the threads 
    for (int i = 0; i < 5; i++) 
    { 
     Thread cpuThread = new Thread((start) => 
     { 
      lock (threads) 
      { 
       threads.Add(GetCurrentWin32ThreadId(), Thread.CurrentThread); 
      } 

      ConsumeCPU(20 * (int)start); 
     }); 
     cpuThread.Name = "T" + i; 
     cpuThread.Start(i); 
    } 

    // Every second wake up and see how much CPU each thread is using. 
    Thread monitoringThread = new Thread(() => 
     { 
      Stopwatch watch = new Stopwatch(); 
      watch.Start(); 

      while (true) 
      { 
       Thread.Sleep(1000); 
       Console.Write("\r"); 

       double totalTime = ((double)watch.ElapsedMilliseconds); 
       if (totalTime > 0) 
       { 
        Process p = Process.GetCurrentProcess(); 
        foreach (ProcessThread pt in p.Threads) 
        { 
         Thread managedThread; 
         if (threads.TryGetValue(pt.Id, out managedThread)) 
         { 
          double percent = (pt.TotalProcessorTime.TotalMilliseconds/totalTime); 
          Console.Write("{0}-{1:0.00} ", managedThread.Name, percent); 
         } 
        } 
       } 
      } 
     }); 
    monitoringThread.Start(); 
} 


// Helper function that generates a percentage of CPU usage 
public static void ConsumeCPU(int percentage) 
{ 
    Stopwatch watch = new Stopwatch(); 
    watch.Start(); 
    while (true) 
    { 
     if (watch.ElapsedMilliseconds > percentage) 
     { 
      Thread.Sleep(100 - percentage); 
      watch.Reset(); 
      watch.Start(); 
     } 
    } 
} 
} 

ध्यान दें कि यह संभव है कि CLR देशी धागा कि कामयाब धागा के तहत निष्पादित हो रहा है बदल जाएगा। हालांकि, अभ्यास में मुझे यकीन नहीं है कि यह वास्तव में कितनी बार होता है।

संबंधित मुद्दे