Get the % of cpu usage of a running thread (VB.NET)
Version: VB 2005 
Compatibility: VB 2005, VB 2008 
Category: Miscellaneous 
To watch cpu usage from within the thread to be watched:
Dim CPUutil As New ThreadCPUusageWatcher
Dim PercentUsage as Short
CPUutil .Start()
' Use:
CPUutil..NativeThreadID ' to get the id if the current thread, or set the id of the thread to be watched.
PercentUsage  = CPUutil .CPUusage ' to get the current percentage of cpu use of the watched thread
To watch the cpu usage of background threads from another (the main?) thread:
declare CPUutil  public, and then set it new from with the thread to be watched. Ie:
Public  CPUutil as ThreadCPUusageWatcher
' Then, from within the thread to be watched:
CPUutil = New ThreadCPUusageWatcher
CPUutil.Start()
' CPUutil.CPUusage can then be called from any thread.
' Call:
CPUutil.StopWatcher() ' to stop the watcher when your app closes.
Declarations:
Imports System.Diagnostics
Imports System.Threading
Code:
Public Class ThreadCPUusageWatcher
' This class is used to get the % of cpu usage of a running thread by native thread id. 
        ' It's a great way to be able to tell which thread is hammering your cpu. Usage:
        ' To watch cpu usage from within the thread to be watched:
        ' Dim CPUutil As New ThreadCPUusageWatcher
        ' Dim PercentUsage As Short
        ' CPUutil .Start()
        ' Use:
        ' CPUutil..NativeThreadID ' to get the id if the current thread, or set the id of the thread to be watched.
        ' PercentUsage  = CPUutil.CPUusage ' to get the current percentage of cpu use of the watched thread
        ' To watch the cpu usage of background threads from another (the main?) thread:
        ' declare CPUutil public, and then set it new from with the thread to be watched. Ie:
        ' Public CPUutil As ThreadCPUusageWatcher
        ' Then, from within the thread to be watched:
        ' CPUutil = New ThreadCPUusageWatcher
        ' CPUutil.Start()
        ' CPUutil.CPUusage can then be called from any thread.
        ' Call:
        ' CPUutil.StopWatcher() ' to stop the watcher when your app closes.
        Private threadID As Int16
        Private WatcherRunning As Boolean = False
        Private th1 As Thread
        Private Percentage As Long
        Public Sub New()
            threadID = AppDomain.GetCurrentThreadId
        End Sub
        Public Sub New(ByVal NativeThreadID As Int16)
            threadID = NativeThreadID
        End Sub
        Private Function GetCurrentNativeThreadID() As Int16
            GetCurrentNativeThreadID = AppDomain.GetCurrentThreadId
        End Function
        ' Set the native ID of a process thread to be watched, or get your native thread id
        Public Property NativeThreadID() As Int16
            Get
                Return GetCurrentNativeThreadID()
            End Get
            Set(ByVal value As Int16)
                threadID = value
            End Set
        End Property
        Public ReadOnly Property IsRunning() As Boolean
            Get
                Return WatcherRunning
            End Get
        End Property
        Public ReadOnly Property CPUusage() As Long
            Get
                Return Percentage
            End Get
        End Property
        Public Sub StopWatcher()
            WatcherRunning = False
        End Sub
        Public Sub Start()
            th1 = New System.Threading.Thread(AddressOf StartWatcher)
            th1.Start()
        End Sub
        Private Sub StartWatcher()
            Dim tx As System.Diagnostics.ProcessThreadCollection
            Dim t, tId, a, a1, a2, a3, a4, a5, CPUs As Int16
            Dim CPUtimeEnd, CPUtimeStart As Double
            CPUs = Environment.GetEnvironmentVariable("NUMBER_OF_PROCESSORS")
            tx = System.Diagnostics.Process.GetCurrentProcess().Threads
            tId = 0
            For t = 0 To tx.Count - 1
                If tx.Item(t).Id = threadID Then
                    tId = t
                End If
            Next
            If tId = 0 Then
                MsgBox("Thread could not be found.")
                Exit Sub
            End If
            WatcherRunning = True
            Try
                Do While WatcherRunning = True
                    CPUtimeStart = tx.Item(tId).TotalProcessorTime.Milliseconds
                    Thread.Sleep(200)
                    CPUtimeEnd = tx.Item(tId).TotalProcessorTime.Milliseconds
                    If (CPUtimeEnd > CPUtimeStart) Or (CPUtimeEnd = CPUtimeStart) Then
                        a = a + 1
                        If a = 1 Then
                            a1 = CPUtimeEnd - CPUtimeStart
                        ElseIf a = 2 Then
                            a2 = CPUtimeEnd - CPUtimeStart
                        ElseIf a = 3 Then
                            a3 = CPUtimeEnd - CPUtimeStart
                        ElseIf a = 4 Then
                            a4 = CPUtimeEnd - CPUtimeStart
                        ElseIf a = 5 Then
                            a5 = CPUtimeEnd - CPUtimeStart
                        ElseIf a > 5 Then
                            a = 1
                        End If
                        Percentage = ((a1 + a2 + a3 + a4 + a5) / 5) / 2
                        Percentage = Percentage / CPUs
                        If Percentage > 100 Then Percentage = 100
                    End If
                Loop
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
            WatcherRunning = False
        End Sub
    End Class


 
0 comments:
Post a Comment