GetProcessusTime(pid.l)

Programmation d'applications complexes
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

GetProcessusTime(pid.l)

Message par Jacobus »

Un code de test pour calculer le temps processeur monopolisé par une application, un processus. Je ne suis pas convaincu par les résultats obtenus. J'aimerai avoir votre avis et si vous voyez le moyen d'optimiser.

Code PB 4.10 | Win XP sp2 (pas testé ailleurs)
Il faut choisir le mode Time dans la procédure suivant ce que l'on veut afficher.

Code : Tout sélectionner

;structure nécessaire à la recherche des processus
Structure PROCESSENTRY33 
  dwSize.l 
  cntUsage.l 
  th32ProcessID.l 
  th32DefaultHeapID.l 
  th32ModuleID.l 
  cntThreads.l 
  th32ParentProcessID.l 
  pcPriClassBase.l 
  dwFlags.l 
  szExeFile.b[#MAX_PATH] 
EndStructure

ProcedureDLL GetPidProcess(Name.s) 
  Name.s=UCase(Name.s)
  Recherche=0
  If OpenLibrary(0, "Kernel32.dll")     
    CreateToolhelpSnapshot = GetFunction(0, "CreateToolhelp32Snapshot") 
    ProcessFirst           = GetFunction(0, "Process32First") 
    ProcessNext            = GetFunction(0, "Process32Next")    
    If CreateToolhelpSnapshot And ProcessFirst And ProcessNext ; Ensure than all the functions are found      
      Process.PROCESSENTRY33\dwSize = SizeOf(PROCESSENTRY33)       
      Snapshot = CallFunctionFast(CreateToolhelpSnapshot, #TH32CS_SNAPPROCESS, 0) 
      If Snapshot        
        ProcessFound = CallFunctionFast(ProcessFirst, Snapshot, Process) 
        While ProcessFound 
          Nom.s=UCase(PeekS(@Process\szExeFile, -1, #PB_Ascii))
          Nom=GetFilePart(Nom)
          If Nom=Name 
            Recherche =1 
            PID=Process\th32ProcessID
          EndIf
          ProcessFound = CallFunctionFast(ProcessNext, Snapshot, Process)          
        Wend 
      EndIf       
      CloseHandle_(Snapshot) 
    EndIf     
    CloseLibrary(0) 
  EndIf  
  ProcedureReturn PID
EndProcedure

;Il y a 2 structures (Structure FILETIME et Structure SYSTEM_INFO) nécessaires pour le ProcessTime, mais elles sont déjà déclarées et il n'y a pas à les ajouter.
Procedure GetProcessusTime(PID.l)
  
  creation.FILETIME 
  exit.FILETIME 
  kernel.FILETIME 
  user.FILETIME 
  
  sysinfo.SYSTEM_INFO 
  GetSystemInfo_(@sysinfo) 
  numprocs = sysinfo\dwNumberOfProcessors 
  
  hProcess = OpenProcess_(#PROCESS_QUERY_INFORMATION, #False, PID)  
  If GetProcessTimes_(hProcess,@creation,@exit,@kernel,@user) <>0

      Time = user\dwLowDateTime     ;temps passé à exécuter du code d'application     
;      Time = kernel\dwLowDateTime   ;temps passé à exécuter du code système
;      Time = exit\dwLowDateTime     ;date et heure d'arrêt du processus 
;      Time = creation\dwLowDateTime ;date et heure de démarrage du processus
    
   ProcedureReturn Time/1000/numprocs   ;conversion en secondes et division par le nombre de processeurs.
  EndIf 

EndProcedure

 pid = GetPidProcess("PureBasic.exe")
 Debug FormatDate("%hh:%ii:%ss", GetProcessusTime(pid))
Je viens d'éditer pour tenir compte du nombre de processeurs... les valeurs ont l'air plus correctes. :)
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.