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
RSBasic hat geschrieben: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.
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
RSBasic hat geschrieben:Suchst du etwa das hier? http://www.purebasic.fr/english/viewtop ... 00&start=3
Bingo :allright: 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