Bereits laufender Prozess Auslastung ermitteln

Für allgemeine Fragen zur Programmierung mit PureBasic.
smateja
Beiträge: 250
Registriert: 25.11.2004 19:51
Computerausstattung: Alienware Aurora / Intel Core i7 CPU @ 2.8 GHz / 64 Bit OS

Bereits laufender Prozess Auslastung ermitteln

Beitrag 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
PB 4.6 / 32 Bit / 64 Bit
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Bereits laufender Prozess Auslastung ermitteln

Beitrag 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
a²+b²=mc²
smateja
Beiträge: 250
Registriert: 25.11.2004 19:51
Computerausstattung: Alienware Aurora / Intel Core i7 CPU @ 2.8 GHz / 64 Bit OS

Re: Bereits laufender Prozess Auslastung ermitteln

Beitrag 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.
PB 4.6 / 32 Bit / 64 Bit
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Bereits laufender Prozess Auslastung ermitteln

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
smateja
Beiträge: 250
Registriert: 25.11.2004 19:51
Computerausstattung: Alienware Aurora / Intel Core i7 CPU @ 2.8 GHz / 64 Bit OS

Re: Bereits laufender Prozess Auslastung ermitteln

Beitrag von smateja »

Danke - das passt :)
PB 4.6 / 32 Bit / 64 Bit
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: Bereits laufender Prozess Auslastung ermitteln

Beitrag 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 ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Bereits laufender Prozess Auslastung ermitteln

Beitrag von RSBasic »

Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: Bereits laufender Prozess Auslastung ermitteln

Beitrag von Bisonte »

RSBasic hat geschrieben:Suchst du etwa das hier? http://www.purebasic.fr/english/viewtop ... 00&start=3
Bingo :allright: Thx
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
smateja
Beiträge: 250
Registriert: 25.11.2004 19:51
Computerausstattung: Alienware Aurora / Intel Core i7 CPU @ 2.8 GHz / 64 Bit OS

Re: Bereits laufender Prozess Auslastung ermitteln

Beitrag 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
PB 4.6 / 32 Bit / 64 Bit
Antworten