Avatar billede bgo Nybegynder
15. juni 2008 - 17:33 Der er 4 kommentarer og
1 løsning

Korrekt cpu-forbrug på processer

høh, det er officielt: jeg har ingen hjerne :D Jeg har prøvet alt muligt, men enten får jeg altid 0, 1 ciffer når der skal være 2 (+ underlige negative tal), eller op til langt over 100 endda over 1000 (+ underlige negative tal), når jeg forsøger at få processers procentandel i cpu-forbrug.

Koden er som følger (bærende præg af at jeg har forsøgt alskens ting):
Imports System
Imports System.Diagnostics
Imports System.Threading
Imports System.IO
Imports System.ServiceProcess

Module Module1

    Sub Main()
        While True
            Dim all_processes As Process() = Process.GetProcesses()
            Dim p1() As Long = {0.0}
            Dim p2() As Long = {0.0}
            Dim ptotal As Long = 0.0

            Dim t1 As Long = DateTime.Now.Ticks
            For index As Integer = 0 To all_processes.Length() - 1
                If Not all_processes(index).ProcessName = "Idle" Then
                    p1(index) = all_processes(index).TotalProcessorTime.Ticks
                End If
                ReDim Preserve p1(p1.Length())
            Next
            Thread.Sleep(1000)
            Dim t2 As Long = DateTime.Now.Ticks
            For index As Integer = 0 To all_processes.Length() - 1
                If Not all_processes(index).ProcessName = "Idle" Then
                    Try
                        p2(index) = all_processes(index).TotalProcessorTime.Ticks
                        ReDim Preserve p2(p2.Length())
                    Catch ex As Exception
                    Finally
                    End Try
                End If

            Next
            ptotal = 0.0
            For index As Integer = 0 To all_processes.Length() - 1
                Try
                    ptotal += p2(index) - p1(index)
                Catch ex As Exception
                Finally
                End Try
            Next
            Dim pct As Integer = 0
            For index As Integer = 0 To all_processes.Length() - 1
                'pct = CInt(((2000 * (p2(index) - p1(index)) \ ptotal) \ (t2 - t1)))
                Try
                    pct = CInt(((1 * (p2(index) - p1(index))) \ ((t2 - t1) - ptotal)) * 1) '* 100)
                Catch ex As Exception
                Finally
                End Try
                Console.WriteLine(all_processes(index).ProcessName().ToString + " " + pct.ToString + " " + ptotal.ToString + " " + Str((t2 - t1)) + Str((p2(index) - p1(index))))

            Next

        End While
    End Sub

End Module

Jeg forsøger her også at tage højde for at processer stopper midt i det hele
Avatar billede arne_v Ekspert
22. juni 2008 - 20:46 #1
Modificeret version:

Imports System
Imports System.Diagnostics
Imports System.Threading
Imports System.IO

Module Module1
    Sub Main()
        While True
            Dim allp As Process() = Process.GetProcesses()
            Dim t1 As Long = DateTime.Now.Ticks
            Dim p1(allp.Length) As Long
            For i As Integer = 0 To allp.Length - 1
                If allp(i).ProcessName <> "Idle" Then
                    p1(i) = allp(i).TotalProcessorTime.Ticks
                End If
            Next
            Thread.Sleep(5000)
            Dim p2(allp.Length) As Long
            For i As Integer = 0 To allp.Length - 1
                If allp(i).ProcessName <> "Idle" Then
                    Try
                        p2(i) = allp(i).TotalProcessorTime.Ticks
                    Catch ex As Exception
                    Finally
                    End Try
                End If
            Next
            Dim t2 As Long = DateTime.Now.Ticks
            Dim ptotal As Long = 0.0
            For i As Integer = 0 To allp.Length - 1
                ptotal += (p2(i) - p1(i))
            Next
            For i As Integer = 0 To allp.Length - 1
                If(p1(i) > 0 And p2(i) > 0) Then
                    Dim pct As Double = (p2(i) - p1(i)) * 100.0 / ptotal
                    Console.WriteLine(allp(i).ProcessName & " " & pct)
                End If
            Next
        End While
    End Sub

End Module
Avatar billede bgo Nybegynder
25. juni 2008 - 16:10 #2
Jeg ser hvor jeg går galt i byen :) Skal lige have testet med højere CPU-forbrug, men det ser ud til at virke helt efter hensigten :) Tror jeg har været lidt rigelig overambitiøs da jeg prøvede mig frem :)
Avatar billede bgo Nybegynder
28. august 2008 - 15:58 #3
arne, smider du lige et svar? :)
Avatar billede arne_v Ekspert
28. august 2008 - 17:19 #4
kommer her
Avatar billede arne_v Ekspert
28. oktober 2008 - 03:08 #5
så mangler du bare at acceptere svaret
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester