Avatar billede pissed_squirrel Nybegynder
03. april 2003 - 17:23 Der er 38 kommentarer og
1 løsning

finde CPU load og vise det i progressbar

Er der nogle der kan hjælpe mig med noget kode der kan vise det aktuelle CPU load i en progressbar ??

Jeg har kigget i de her spørgsmål, men ingen af dem virkede for mig:

http://www.eksperten.dk/spm/280983
http://www.eksperten.dk/spm/263658

Det skulle kunne lade sig gøre

Der er flere point hvis det kræver det !
Avatar billede exp-ralle Nybegynder
03. april 2003 - 17:31 #1
Følger lige med...
Avatar billede pissed_squirrel Nybegynder
03. april 2003 - 18:02 #2
Hehe :D
Avatar billede bccinlove Nybegynder
03. april 2003 - 18:44 #3
er også bare lige med på en lytter!
Avatar billede mortrr Praktikant
03. april 2003 - 19:14 #4
Til Win2K og XP. Bruger WMI.

Formular med en progressbar og en timer:
=============================
Option Explicit
Dim SwitchTime(2, 33)
Dim SwitchTick(2, 33)
Dim TimeCurrent As Integer, TimePrevious As Integer, ProcMax As Integer
Dim objConn As Variant, objSvc As Variant, objEnum As Variant, oWbemObject As Variant

Const wbemFlagReturnWhenComplete = 0


Private Sub Form_Load()

    Set objConn = CreateObject("WbemScripting.SWbemLocator")

    Set objSvc = objConn.ConnectServer("", "root\cimv2")

    ProcMax = 0
    Set objEnum = objSvc.InstancesOf("Win32_PerfRawData_PerfOs_Processor", wbemFlagReturnWhenComplete)
    For Each oWbemObject In objEnum
        SwitchTime(0, ProcMax) = oWbemObject.Properties_.Item("Timestamp_Sys100NS").Value
        SwitchTick(0, ProcMax) = oWbemObject.Properties_.Item("PercentUserTime").Value
    Next oWbemObject

    TimeCurrent = 0
    TimePrevious = 0
    Timer1.Enabled = True

End Sub

Private Sub Timer1_Timer()
Dim j As Integer, CpuLoad As Integer

        TimePrevious = TimeCurrent
        TimeCurrent = 1 - TimeCurrent

        Set objEnum = objSvc.InstancesOf("Win32_PerfRawData_PerfOs_Processor", wbemFlagReturnWhenComplete)
        j = 0
        For Each oWbemObject In objEnum

            SwitchTime(TimeCurrent, j) = oWbemObject.Properties_.Item("Timestamp_Sys100NS").Value
            SwitchTick(TimeCurrent, j) = oWbemObject.Properties_.Item("PercentUserTime").Value

            CpuLoad = Round(100 * (SwitchTick(TimeCurrent, j) - SwitchTick(TimePrevious, j)) / (SwitchTime(TimeCurrent, j) - SwitchTime(TimePrevious, j)))
            j = j + 1
            If j = 1 Then
              ProgressBar1.Value = CpuLoad
            End If
        Next oWbemObject

End Sub
=============================
Hvis den skal måle flere cpu'er kan man tilføje flere progressbars.
Avatar billede pissed_squirrel Nybegynder
03. april 2003 - 20:11 #5
Jeg kan ikke få det til at virke....

Den viser intet....
Avatar billede pissed_squirrel Nybegynder
03. april 2003 - 20:14 #6
Nogle af jer andre der kan få det til at virke ???

Den viser intet hos mig, og jeg har en statusbar som fortæller mig hvor meget der bliver brugt, så jeg kan sagtens se hvor meget der er i brug....

Hvad mener du med "Bruger WMI" ??
Avatar billede mortrr Praktikant
03. april 2003 - 20:57 #7
WMI er Windows Management Instrumentation.
En metode til at få informationer om alt omkring fx udstyr og events på computeren (eller andre computere på netværket).
Avatar billede mortrr Praktikant
03. april 2003 - 20:59 #8
Der mangler forøvrigt en tæller, men det har kun indflydelse ved flere processorer
For Each oWbemObject In objEnum
        SwitchTime(0, ProcMax) = oWbemObject.Properties_.Item("Timestamp_Sys100NS").Value
        SwitchTick(0, ProcMax) = oWbemObject.Properties_.Item("PercentUserTime").Value
        ProcMax=ProcMax+1
Next oWbemObject
Avatar billede pissed_squirrel Nybegynder
03. april 2003 - 21:12 #9
Dvs. jeg behøver ikke den tæller hvis jeg kun har en processor ??
Avatar billede pissed_squirrel Nybegynder
03. april 2003 - 21:13 #10
hvis den nu skal med, hvor skal den så placeres i forhold til den anden kode du kom med ??

Kunne jo være det ville få den til at virke...
Avatar billede mortrr Praktikant
03. april 2003 - 22:10 #11
Den skal erstatte de linier der ligner.
Det var derfor jeg viste linierne omkring.
Avatar billede mortrr Praktikant
03. april 2003 - 22:15 #12
Har du forresten sat timer intervallet til noget?
Ellers vil den aldrig trigge og vise noget.

Skift
    Timer1.Enabled = True
ud med
    Timer1.Interval = 1000
    Timer1.Enabled = True
Avatar billede pissed_squirrel Nybegynder
03. april 2003 - 22:52 #13
Jeg får en

Run-time error '380'
Invalid property value

Hvad kan der være galt ??

Jeg har tilføjet en interval til timer, og derfor får jeg fejlen
Avatar billede mortrr Praktikant
03. april 2003 - 23:42 #14
Hvor får du den fejl?
Avatar billede pissed_squirrel Nybegynder
04. april 2003 - 09:01 #15
Hvis jeg bare kører den inde i VB, så går hele programmet ned, men hvis jeg compiler den, så får jeg denne RUN-TIME fejl...

Nogen anelse om hvad der kunne være galt ??
Avatar billede mortrr Praktikant
04. april 2003 - 10:09 #16
Hvilket styresystem er det?

Kunne du ikke prøve at kopierer din kode herind.
Kunne være en stavefejl eller lignende.
Avatar billede pissed_squirrel Nybegynder
04. april 2003 - 10:54 #17
Jeg har bare sat den ind som du har skrevet den, har også prøvet den med et helt clean project, hvilket heller ikke virker.

Jeg bruger WinXP Pro + SP1

Virker det hos dig ??
Avatar billede mortrr Praktikant
04. april 2003 - 11:52 #18
Yep. Har prøvet den på win2k og winxp.

Har også lige prøvet at oprette et nyt program.
Kopierede koden, og tilføjede linien med Timer1.Interval=1000, indsatte en ProgressBar og en Timer, og det virkede med det samme.

Mystisk.
Avatar billede pissed_squirrel Nybegynder
04. april 2003 - 13:18 #19
MEGET mystisk....
Avatar billede pissed_squirrel Nybegynder
04. april 2003 - 13:24 #20
Det er meget mystisk, for den virker på en anden computer jeg har prøvet det på....godt nok kommer der efter lidt tid en fejl om:

Run-time error '380'
Invalid property value

ved

ProgressBar1.Value = CpuLoad

Men den virker da i noget tid, det gør den slet ikke på min anden computer....

Hvilken version af VB har du, og har du installeret nogle SP til ??
Avatar billede mortrr Praktikant
04. april 2003 - 13:29 #21
Det er en VB6 SP5

Timer Intervallet må ikke være for kort, minimum 500, da den beregner et gennemsnit. Hvis intervallet er for kort, kan man risikere at få nogle vilde tal.
Avatar billede pissed_squirrel Nybegynder
07. april 2003 - 12:41 #22
Det er meget mærkeligt, for jeg har installeret SP5 på min stationær, men ikke på min bærbare, og det virker "lidt" på min bærbare.....men slet ikke på min stationære....
Avatar billede mortrr Praktikant
07. april 2003 - 15:46 #23
Hmm - beklager.
Har været rundt på diverse computere, og den virkede på alle.

Men som sagt virker metoden kun på 2K og XP.
Hvis det er 95/98/ME, skal du bruge en af de metoder du linkede til.

Du kunne eventuelt lave et check på om cpuload<0 eller >100 inden du propper den ind i progressbar1.value
Avatar billede pissed_squirrel Nybegynder
07. april 2003 - 17:19 #24
Det prøver jeg så....
Avatar billede pissed_squirrel Nybegynder
07. april 2003 - 17:21 #25
Hvordan skal den If sætning så bygges op ??

If CpuLoad<0 or CpuLoad>100 Then
  ProgressBar1.Value = CpuLoad
End if

Sådan noget lignende giver vel det forkerte resultat ??
Avatar billede pissed_squirrel Nybegynder
07. april 2003 - 17:25 #26
Jeg lavede det med:

If Not CpuLoad<0 or CpuLoad>100 Then
  ProgressBar1.Value = CpuLoad
End if

Men jeg får stadig en fejl, dog først efter noget tid, ligesom med min bærbare computer !

Nu virker det da en lille smule....:D
Avatar billede mortrr Praktikant
07. april 2003 - 17:27 #27
Det vil give det forkerte, men du kan jo lige prøve om den ellers opfører sig nogenlunde.
If CpuLoad<0 Then CpuLoad=0
If CpuLoad>100 Then CpuLoad=100
ProgressBar1.Value = CpuLoad

Den du viser mangler en parantes omkring, ellers vil not kun have effekt på cpuload<0
Avatar billede mortrr Praktikant
07. april 2003 - 17:33 #28
Fandt en anden metode, også med wmi (2K/XP).

Den giver et øjebliksbillede (hvor den anden gav gennemsnit siden sidst)

Hurtigt eksempel:
Set ProcSet = GetObject("winmgmts:").InstancesOf("Win32_Processor")
For Each objProcessor In ProcSet
    Debug.Print objProcessor.LoadPercentage
Next
Avatar billede pissed_squirrel Nybegynder
08. april 2003 - 13:31 #29
Det med:

If CpuLoad<0 Then CpuLoad=0
If CpuLoad>100 Then CpuLoad=100
ProgressBar1.Value = CpuLoad

Hjalp mig ikke....stadig:

Run-time error '380'
Invalid property value


Prøver lige den nye du her skrevet
Avatar billede pissed_squirrel Nybegynder
08. april 2003 - 13:32 #30
Dvs, jeg ved ikke helt hvor jeg skal gøre af den kode du har skrevet....hehe jeg er stadig newb :D
Avatar billede mortrr Praktikant
08. april 2003 - 13:51 #31
Det var faktisk bare inde i
          If j = 1 Then
              ProgressBar1.Value = CpuLoad
            End If
så det bliver til
          If j = 1 Then
              If CpuLoad<0 Then CpuLoad=0
              If CpuLoad>100 Then CpuLoad=100
              ProgressBar1.Value = CpuLoad
            End If
Avatar billede pissed_squirrel Nybegynder
08. april 2003 - 14:15 #32
Ikke så meget den, det var jo den der heller ikke virkede for mig....

Det var den nye metode, som også brugte wmi, hvor jeg skulle gøre af den, hvis jeg skulle bruge den....
Avatar billede mortrr Praktikant
08. april 2003 - 14:22 #33
Bob bob - det bliver nok:

Private Sub Form_Load()
Timer1.Interval = 500
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
j = 1
Set ProcSet = GetObject("winmgmts:").InstancesOf("Win32_Processor")
For Each objProcessor In ProcSet
    If j = 1 Then
      ProgressBar1.Value = objProcessor.LoadPercentage
    End If
    j = j + 1
Next
End Sub
Avatar billede pissed_squirrel Nybegynder
08. april 2003 - 15:32 #34
I stedet for alt denne kode:

    Dim j As Integer, CpuLoad As Integer

        TimePrevious = TimeCurrent
        TimeCurrent = 1 - TimeCurrent

        Set objEnum = objSvc.InstancesOf("Win32_PerfRawData_PerfOs_Processor", wbemFlagReturnWhenComplete)
        j = 0
        For Each oWbemObject In objEnum

            SwitchTime(TimeCurrent, j) = oWbemObject.Properties_.Item("Timestamp_Sys100NS").Value
            SwitchTick(TimeCurrent, j) = oWbemObject.Properties_.Item("PercentUserTime").Value

            CpuLoad = Round(100 * (SwitchTick(TimeCurrent, j) - SwitchTick(TimePrevious, j)) / (SwitchTime(TimeCurrent, j) - SwitchTime(TimePrevious, j)))
            j = j + 1
            If j = 1 Then
                If CpuLoad < 0 Then
                    CpuLoad = 0
                End If
                If CpuLoad > 100 Then
                    CpuLoad = 100
                End If
                ProgressBar1.Value = CpuLoad
               
            End If
        Next oWbemObject

??
Avatar billede pissed_squirrel Nybegynder
08. april 2003 - 15:37 #35
Hvis jeg bare udskrifter alt den kode jeg har skrevet ovenfor, med den nye kode du kom med, så viser den 100% hele tiden....eller i hvert i faldet meet tæt på hundrede, og det er jo ikke rigtigt
Avatar billede mortrr Praktikant
08. april 2003 - 15:40 #36
Den nye kode jeg viste er alt hvad du har behov for.
Ny exe - formular med progrssbar og timer - indsæt koden. Ded var ded.
Avatar billede pissed_squirrel Nybegynder
10. april 2003 - 20:38 #37
Den låser programmet 1-2 sekunder og faktisk køre hele programmet meget langsomt !
Avatar billede mortrr Praktikant
10. april 2003 - 22:23 #38
Den tager godt nok lidt tid om at forespørge på processorerne, men det virker ikke som om den tager 1 sekund her. Man kan mærke det lidt hvis man trækker rundt på vinduet.

Der må da være en måde man kan gøre det på i VB...
Avatar billede pissed_squirrel Nybegynder
11. april 2003 - 21:58 #39
Hmmm....Måske en formatering ville hjælpe ;D
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