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
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).
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
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.
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.
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....
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
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
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
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
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
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
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...
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.