Seite 1 von 1
Bereits laufender Prozess Auslastung ermitteln
Verfasst: 29.07.2011 11:51
von smateja
Hallo zusammen,
ich versuche gerade von einem bereits laufendem Prozess via PB die aktuelle Prozessorlast und Arbeitsspeichergröße zu ermitteln. (Taskmanager -> Reiter Prozesse)
An die PID der einzelnen Prozesse komme ich heran.
Hat hier jemand eine Idee wie ich das lösen könnte?
LG und merci im Vorraus
Re: Bereits laufender Prozess Auslastung ermitteln
Verfasst: 29.07.2011 12:45
von Kiffi
Beispielsweise mit WMI (benötigt COMate von srod):
Code: Alles auswählen
IncludePath #PB_Compiler_Home + "srod\comateplus\" ; Pfad anpassen
XIncludeFile "comateplus.pbi"
EnableExplicit
Procedure.s WMI_ExecQuery(Query.s, Fieldname.s)
Protected objWMIService.COMateObject
Protected objItem.COMateObject
Protected colItems.COMateEnumObject
Protected Computer.s
Protected Value.s
Protected Z1, Z2
Value = "-1"
Computer = "."
Z1 = ElapsedMilliseconds()
objWMIService = COMate_GetObject("winmgmts:\\" + Computer + "\root\cimv2", "")
If objWMIService
Query = ReplaceString(Query, "'", "$0027")
colItems = objWMIService\CreateEnumeration("ExecQuery('" + Query + "')")
If colItems
objItem = colItems\GetNextObject()
While objItem
Value = objItem\GetStringProperty(Fieldname)
objItem\Release()
objItem = colItems\GetNextObject()
Wend
colItems\Release()
Else
Debug("!colItems")
EndIf
objWMIService\Release()
Else
Debug("!objWMIService")
EndIf
Z2 = ElapsedMilliseconds()
; Debug(Fieldname + ": " + Value + " (" + Str(Z2-Z1) + " ms)")
ProcedureReturn Value
EndProcedure
Debug "AvailableMBytes: " + WMI_ExecQuery("Select * FROM Win32_PerfFormattedData_PerfOS_Memory", "AvailableMBytes")
Debug "LoadPercentage: " + WMI_ExecQuery("SELECT * FROM Win32_Processor", "LoadPercentage")
Grüße ... Kiffi
Re: Bereits laufender Prozess Auslastung ermitteln
Verfasst: 29.07.2011 15:05
von smateja
Merci für dein Lösungsansatz.
Gibts evtl. ohne das COMate eine Lösung?
ich habe was gefunden was die PID ermittelt - evtl. kann jemand der sich hier ein wenig mehr auskennt als ich das für die aktuelle Last umbauen?
Code: Alles auswählen
Structure PROCESSENTRY32s
dwsize.l
cntusage.l
th32ProcessID.l
th32DefaultHeapID.l
th32ModuleID.l
cntThreads.l
th32ParentProcessID.l
pcPriClassBase.l
dwFlags.l
szExeFile.s{1024}
EndStructure
Procedure.l FindPid(s.s)
Process.PROCESSENTRY32s
ProcSnap.l
ProcSnap = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS, 0)
If ProcSnap <> 0
Process\dwsize=SizeOf(Process)
Process32First_(ProcSnap, Process)
While Process32Next_(ProcSnap, Process) > 0
If Process\szExeFile = s
ProcedureReturn Process\th32ProcessID
Break
EndIf
Wend
EndIf
EndProcedure
Debug FindPid("explorer.exe")
Merci nochmals für die Mithilfe.
Re: Bereits laufender Prozess Auslastung ermitteln
Verfasst: 29.07.2011 15:14
von RSBasic
http://pbosl.purearea.net/pbosl_src.zip
Siehe "PBOSL_Process", da hast du alle WinAPIs, die du brauchst, um die Auslastung und Größe zu ermitteln.
Re: Bereits laufender Prozess Auslastung ermitteln
Verfasst: 29.07.2011 15:28
von smateja
Danke - das passt

Re: Bereits laufender Prozess Auslastung ermitteln
Verfasst: 30.07.2011 10:57
von Bisonte
Ich beschäftige mich gerade auch mit der CPU Auslastung eines einzelnen Programmes,
aber zur Auslastung hab ich keine API-Funktion gefunden. In der PBOSL fand ich lediglich
zum Auslesen des Speicherverbrauchs Funktionen...
Könnte mir jemand einen Tipp geben ?
Re: Bereits laufender Prozess Auslastung ermitteln
Verfasst: 30.07.2011 11:06
von RSBasic
Re: Bereits laufender Prozess Auslastung ermitteln
Verfasst: 30.07.2011 13:11
von Bisonte
Bingo

Thx
Re: Bereits laufender Prozess Auslastung ermitteln
Verfasst: 09.08.2011 13:54
von smateja
Hey ho - also Prinzipiell ist das ja genua das was ich brauche - nur - blick ichs mal auf keinem Auge. Evtl. hat ja jemand die Erfahrung und kann mir das ein wenig umsticken?
Idealerweise als Prozedure ohne Thread aufruf der ich dann einfach die PID oder den Prozessname mitgeben kann und als Rückgabe Wert erhalte ich die aktuelle CPU auslastung des angegeben Prozesses.
Währe euch echt sehr dankbar.
LG und merci