IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Monitorer la conso processeur et mémoire du processus correspondant à mon appli [WD17]


Sujet :

WinDev

  1. #1
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut Monitorer la conso processeur et mémoire du processus correspondant à mon appli
    Bonjour,

    je souhaite monitorer l'évolution du processus correspondant à mon exécutable, tant au niveau conso mémoire que processeur, tout cela de façon instantanée

    Est-ce qu'on a des fonctions pour interroger le système ?

    Je suis sur que ça intéressera du monde

    Merci
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  2. #2
    R&B
    R&B est déconnecté
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2005
    Messages : 571
    Points : 1 263
    Points
    1 263
    Par défaut
    Historiquement on est sur les fonctionnalités WMI .
    Le hic dans ce cas, c'est la dépendance avec le framework .NET.

  3. #3
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    apparemment ça serait possible via l'api GetProcessMemoryInfo de la dll psapi mais faut que je creuse un peu les fonctions et surtout si cette dll est présente sur tous les systèmes Windows avec les mêmes méthodes

    d'ailleurs si quelqu'un a un exemple, je prends volontiers
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  4. #4
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    on peut se passer de l'utilisation du dotnet pour utiliser le WMI avec windev :

    1 - En faisant du VBSCRIPT avec l'objet COM "MSScriptControl.ScriptControl"

    2 - En utilisant l'objet COM "WbemScripting.SWbemLocator" ( itemindex utilisable à partir de vista)

    Voici deux exemples qui montrent la mise en oeuvre de ces deux méthodes dans windev. Les exemples listent les processus en cours.

    pour 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    sList est une chaîne
    oScript est un objet automation "MSScriptControl.ScriptControl"
    // chaine qui représente le code VBSCRIPT
    sScriptVBS est une chaîne = [
    Function ScanProcess()
    Dim objWMIService, colItems, objItem, sInfo
     
    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select Caption from Win32_Process")
     
    sInfo = ""
    For Each objItem In colItems
    If sInfo <> "" Then sInfo = sInfo & Chr(13) & Chr(10)
    sInfo = sInfo & objItem.Caption
    Next
     
    ScanProcess = sInfo
     
    End Function
    ]
     
    QUAND EXCEPTION DANS
    oScript>>Language("VBScript")
    oScript>>Reset
    oScript>>AddCode(sScriptVBS)
    oScript>>Timeout(-1) //pas de timeout
    sList = oScript>>Run("ScanProcess") //Appel
    // le resultat est dans sList 
    FAIRE
    Erreur("Erreur execution WMI",ExceptionInfo(errInfo))
    ExceptionActive()
    FIN
    pour 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    // J.P 10/2011 - WMI en utilisant l'objet COM "WbemScripting.SWbemLocator"
    // Exemple pour retrouver la liste des processus actifs du système
    // la liste des processus est écrite dans le tableau TabResWMI 
    objLocator est un objet automation "WbemScripting.SWbemLocator"
    objService est un objet automation dynamique
    Resultats est un objet automation dynamique
    TabResWMI est un tableau de chaînes
    x est un entier
    UnRésultat est une chaîne
    QUAND EXCEPTION DANS
    objService = objLocator>>ConnectServer(".", "root\cimv2")
    objService>>Security_>>ImpersonationLevel = 3 
    Resultats = objService>>ExecQuery("Select Caption from Win32_Process ")
    POUR x = 0 _A_ Resultats>>Count -1
    UnRésultat = Resultats>>ItemIndex(x)>>Properties_>>Item("Caption")>>Value 
    SI UnRésultat <> "" ALORS
     TableauAjoute(TabResWMI,UnRésultat)
    // Trace(UnRésultat)
    FIN
    FIN
    FAIRE
    Erreur("Erreur WMI : " + ExceptionInfo())
    FIN
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #5
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    En tout cas en utilisant dotnet dans windev pour faire ce que tu demandes bvadam c'est facile :

    Voici un bout de code qui affiche toutes les deux secondes la mémoire et le pourcentage cpu utilisés par WDTst :
    On utilise la classe performancecounter qui se trouve dans System.Diagnostics

    1 - Ajouter l'assemblage dotnet System à son projet

    2 - Le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ramCounter est un PerformanceCounter("Process", "Working Set", "WDTst")
    cpuCounter est un PerformanceCounter("Process", "% Processor Time", "WDTst")
     
    BOUCLE
    ram est un entier = ramCounter.NextValue();
    cpu est un entier = cpuCounter.NextValue();
    Trace("RAM: "+(ram/1024/1024)+" MB; CPU: "+(cpu)+" %")
    Multitâche(-200)
    FIN
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  6. #6
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Est-ce que ce même assembly sera compatible avec toutes les versions de Windows, sans forcément devoir installer le Framework x.y à chaque fois ?

    En fait, j'ai un dossier qui contient mon appli (.exe et les bibliothèques nécessaires) sur le réseau, et les gens le prenne sur leur poste et ça marche, pour l'instant.
    Je ne voudrais pas que mon appli intègre des spécificités qui impose de télécharger un Framework quelconque...

    Est-ce que quelqu'un peut confirmer que si j'ajoute l'assembly dotnet System à mon projet WinDev, je n'aurai pas ces contraintes ?

    Merci
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  7. #7
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    Si tous les postes ont une version de windows supérieure ou égale à Windows 7 il y a des chances qu'il ne soit pas nécessaire d'installer le framework dotnet ( A partir de windows 7 le framework est installé par défaut avec l' O.S) . Par contre si il y a des postes en XP l'installation sera nécessaire.
    Tu peux te rabattre sur le WMI
    voici un code WMI qui liste tous les processus avec l'usage CPU et la mémoire utilisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     objLocator est un objet Automation "WbemScripting.SWbemLocator"
    objService est un objet Automation dynamique
    x est un entier
    Name est une chaîne  // nom du processus
    Description est une chaîne // description
    PercentProcessorTime est un entier // usage CPU
    workingSet est un entier  // Mémoire utilisée
    QUAND EXCEPTION DANS
    	objService = objLocator>>ConnectServer(".", "root\cimv2")
    	objService>>Security_>>ImpersonationLevel = 3 
    	Resultats = objService>>ExecQuery("Select * from Win32_PerfFormattedData_PerfProc_Process")
    	POUR x = 0 _A_ Resultats>>Count -1
    		Name = Resultats>>ItemIndex(x)>>Properties_>>Item("Name")>>Value 
    		PercentProcessorTime = Resultats>>ItemIndex(x)>>Properties_>>Item("PercentProcessorTime")>>Value
    		workingSet = Resultats>>ItemIndex(x)>>Properties_>>Item("workingSet")>>Value
    		SI UnRésultat <> "" ALORS
            Trace(Name, "  :  ", PercentProcessorTime," - " ,workingSet)
    		FIN
    	FIN
    FAIRE
    	Erreur("Erreur WMI : " + ExceptionInfo())
    FIN
    Pour le WMI le problème c'est que c'est assez lent à s'exécuter.
    Après il faut voir du côté des apis windows
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  8. #8
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Merci jurassic pork (j'adore ce pseudo !! et ton avatar me fait penser aux méchants cochons de duke nukem !)

    Bref, jusqu'à présent j'avais essayé ce code, mais la valeur retournée ne correspond pas à ce que j'ai dans le gestionnaire des tâches :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    hwndprocess est un entier 
    nomprocess est une chaîne ASCIIZ de 1024 
    lpidProcess est un tableau  de 100 entiers 
    cb est un entier = Dimension(lpidProcess) * 4 
    cbNeeded est un entier 
     
    PROCESS_MEMORY_COUNTERS est une structure 
    	cb est un entier 
    	PageFaultCount est un entier 
    	PeakWorkingSetSize est un entier 
    	WorkingSetSize est un entier   
    	QuotaPeakPagedPoolUsage est un entier   
    	QuotaPagedPoolUsage est un entier   
    	QuotaPeakNonPagedPoolUsage est un entier   
    	QuotaNonPagedPoolUsage est un entier   
    	PagefileUsage est un entier   
    	PeakPagefileUsage est un entier 
    FIN 
     
    p_m est un PROCESS_MEMORY_COUNTERS 
    p_m:cb = Dimension(p_m) 
     
    // recherche du process 
    API ( "Psapi" , "EnumProcesses" , &lpidProcess , cb , &cbNeeded ) 
    hwndprocess = API ( "kernel32" , "GetCurrentProcess" )
     
    // on rempli la structure pour le process 
    API ( "Psapi" , "GetProcessMemoryInfo" , hwndprocess , &p_m , Dimension(p_m) ) 
    // on cherche le nom du process 
    API ( "Psapi" , "GetProcessImageFileNameA", hwndprocess , &nomprocess , 1024 ) 
    // on ferme l'accès au process 
    API ( "kernel32" , "CloseHandle" , hwndprocess ) 
    // on extrait le nom de la chaine retournée 
    nomprocess = ExtraitChaîne ( nomprocess , 1 , "\" , DepuisFin ) 
     
    Trace (nomprocess + TAB + p_m:WorkingSetSize/1024)
    Concernant ta dernière réponse (code wmi) ça me fait planter mon appli, on dirait qu'elle bosse (cpu monte à 20) mais ne me retourne rien.
    Comment je peux débugger ?
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  9. #9
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    le code met plusieurs secondes a s'exécuter il faut être patient ou alors il faudrait le lancer dans un thread pour qu'il ne bloque pas l'appli. En mettant une condition sélective WHERE avec seulement le processus désiré dans la requête WMI cela serait beaucoup plus rapide.
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  10. #10
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    OK dans ton code il faut mettre

    SI Name <> "" ALORS
    Trace(Name, " : ", PercentProcessorTime," - " ,workingSet)
    FIN

    mais ça occupe toute mon appli, je n'ai plus la main sur l'interface

    Et si je filtre sur le Name = "WDTst" ça me sort la même valeur de conso mémoire qu'avec mon code de toute à l'heure, qui n'est pas raccord avec le gestionnaire des tâches
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  11. #11
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    moi je l'ai mis dans un timer exécuté toutes les secondes (je pourrai éventuellement mettre plus)

    voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    objLocator est un objet Automation "WbemScripting.SWbemLocator"
    objService est un objet Automation dynamique
    x est un entier
    Name est une chaîne  // nom du processus
    PercentProcessorTime est un entier // usage CPU
    workingSet est un entier  // Mémoire utilisée
    Resultats est un objet Automation dynamique
     
    objService = objLocator>>ConnectServer(".", "root\cimv2")
    objService>>Security_>>ImpersonationLevel = 3 
    Resultats = objService>>ExecQuery("Select * from Win32_PerfFormattedData_PerfProc_Process WHERE Name = 'WDTst'")
    Name = Resultats>>ItemIndex(x)>>Properties_>>Item("Name")>>Value 
    PercentProcessorTime = Resultats>>ItemIndex(x)>>Properties_>>Item("PercentProcessorTime")>>Value
    workingSet = Resultats>>ItemIndex(x)>>Properties_>>Item("workingSet")>>Value
    Trace(Name, "  :  ", PercentProcessorTime," - " ,workingSet)
    N'empêche que la valeur de la ram consommée est pas raccord avec le gestionnaire des tâches :

    32210944 indiqué par wmi, et 10372 dans le gestionnaire des tâches

    Le taux de charge cpu ne correspond pas non plus.

    J'ai lu je ne sais plus où que certaines méthodes n'étaient valables que jusqu'à XP/2003Server, serait-ce le cas ici et expliquerait les mauvaises valeurs ?
    Y'a-t-il moyen de corriger via une règle en fonction de l'OS ?
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  12. #12
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    moi j'ai la même valeur :
    dans le gestionnaire de tâche il faut regarder Plage de travail (mémoire) et pas Mémoire (jeu de travail privé)
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  13. #13
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    moi j'ai la même valeur :
    dans le gestionnaire de tâche il faut regarder Plage de travail (mémoire) et pas Mémoire (jeu de travail privé)
    je n'ai pas cette colonne
    j'ai bien Mémoire (jeu de travail privé) mais pas l'autre

    et pour le cpu pour toi c'est bon aussi ??
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  14. #14
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Ok dans affichage on peut afficher cette colonne supplémentaire, il y a visiblement un rapport de 1024 entre le wmi et le gestionnaire des tâches

    Mais quelle différence entre "Mémoire (jeu de travail privé)" et "Plage de travail (mémoire)" ?

    Pourquoi par défaut n'a-t-on pas cette seconde colonne affichée au lieu de la première si elle n'est pas pertinente ?


    Enfin pour le CPU pour toi c'est cohérent ?

    Merci
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  15. #15
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    pour poursuivre la discussion, voici donc le code qui me permet d'obtenir la ram et le cpu du process WDTst (à bien lancer dans un thread sinon j'ai l'impression que ça ralentit l'appli):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    objLocator est un objet Automation "WbemScripting.SWbemLocator"
    objService est un objet Automation dynamique
    x est un entier
    Name est une chaîne  // nom du processus
    PercentProcessorTime est un entier // usage CPU
    workingSet est un entier  // Mémoire utilisée
    Resultats est un objet Automation dynamique
     
    objService = objLocator>>ConnectServer(".", "root\cimv2")
    objService>>Security_>>ImpersonationLevel = 3 
    Resultats = objService>>ExecQuery("Select * from Win32_PerfFormattedData_PerfProc_Process WHERE Name = 'WDTst'")
    Name = Resultats>>ItemIndex(x)>>Properties_>>Item("Name")>>Value 
    PercentProcessorTime = Resultats>>ItemIndex(x)>>Properties_>>Item("PercentProcessorTime")>>Value
    workingSet = Resultats>>ItemIndex(x)>>Properties_>>Item("workingSet")>>Value
     
    //Trace(Name, "  :  ", PercentProcessorTime," - " ,workingSet/1024)
     
    LIB_RAM = "RAM : " + PartieEntière(workingSet/1024) + " Ko"
    LIB_CPU = "CPU : " + PercentProcessorTime + " %"
    Là je voudrais faire en sorte que le code sache récupérer automatiquement le nom de l'exécutable, ou mieux encore le pid du process, car si je lance plusieurs instances de mon appli, alors il va toujours m'afficher les chiffres correspondant à la première instance trouvée via wmi...

    Donc pour être tout à fait correct, comment je peux affiner la requête wmi pour qu'elle fitre directement sur le bon process à tout les coups ?

    Merci à vous
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  16. #16
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,

    tu peux utiliser exeDonnePID pour récupérer l'ID de ton processus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonPID est un entier = 	ExeDonnePID()
    et ensuite faire une requête WMI du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Resultats = objService>>ExecQuery("Select Name,PercentProcessorTime,workingSet,IDProcess  from Win32_PerfFormattedData_PerfProc_Process WHERE IDProcess=" + MonPID)
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  17. #17
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Parfait tout ça !

    Un grand merci à toi.

    Par contre je constate que le pourcentage d'utilisation CPU n'est pas très cohérent avec ce qu'indique le taskmanager, je sais pas pourquoi.
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  18. #18
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Petit retour après 2-3 jours d'utilisation :

    l'intérêt de monitorer l'évolution de la conso ram et cpu n'existe que si on peut voir le changement toutes les secondes au maximum, pour être quasi en temps réel au niveau de la mesure du cpu

    du coup j'ai fait un timer qui appelle ma méthode consoRamCpu() toutes les secondes

    et l'inconvénient de la méthode WMI est que la requête, aussi simple soit elle, et locale en plus, ne renvoit un résultat qu'après 2 bonne secondes, donc bloque un peu l'ihm

    du coup, je lance maintenant consoRamCpu() dans un thread

    enfin je suis obligé de passer le mode thread en "section critiques" car au bout d'un moment un thread veut exécuter consoRamCpu() alors que celui d'avant n'en a pas terminé

    résultat => plantages réguliers de mon application, surtout quand j'utilise des fenêtres qui font également appel aux thread, majoritairement des fenêtres qui génèrent des graphes ou qui moulinent pas mal !


    Donc soit je gère mal mes threads, soit ce gadget de mesure cpu/ram via wmi n'est pas au point et je devrai m'en passer pour le bien du restant de mon appli !
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  19. #19
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    Jurassic Pork a osé écrire :
    Pour le WMI le problème c'est que c'est assez lent à s'exécuter.
    Après il faut voir du côté des apis windows
    ]

    je t'avais prévenu concernant la lenteur des requêtes WMI. Si tu utilisais du dotnet cela serait plus performant (voir mon code plus haut). Pour les api windows il faut mettre les mains dans le cambouis ou faire appel à un spécialiste.
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  20. #20
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    Bonjour,

    J'ai pas tout lu, mais je crois avoir compris que vous aimeriez l'usage mémoire de votre processus.
    Voici une solution simple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    PROCEDURE AfficheUsageMem()
    PROCESS_MEMORY_COUNTERS_EX  est Structure
      cb                            est entier
      PageFaultCount                est entier
      PeakWorkingSetSize            est entier système
      WorkingSetSize                est entier système
      QuotaPeakPagedPoolUsage       est entier système
      QuotaPagedPoolUsage           est entier système
      QuotaPeakNonPagedPoolUsage    est entier système
      QuotaNonPagedPoolUsage        est entier système
      PagefileUsage                 est entier système
      PeakPagefileUsage             est entier système
      PrivateUsage                  est entier système
    FIN
    stMemCount  est un PROCESS_MEMORY_COUNTERS_EX
     
    stMemCount.cb = Dimension(stMemCount)
    SI 0 <> API("psapi.dll", "GetProcessMemoryInfo", API("kernel32", "GetCurrentProcess"), &stMemCount, Dimension(stMemCount)) ALORS
        SAI_Mem = stMemCount.WorkingSetSize
        SAI_MemMax = stMemCount.PeakWorkingSetSize
        SAI_MemPrivé = stMemCount.PrivateUsage
    FIN
    Pour info, GetCurrentProcess renvoie un pseudo-handle égal à -1. C'est pour ça qu'il est inutile de faire un CloseHandle.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Consommation mémoire du processus
    Par Ange_blond dans le forum Threads & Processus
    Réponses: 12
    Dernier message: 06/09/2010, 17h30
  2. Monitoring de la charge CPU pour un processus
    Par cheverny dans le forum Windows
    Réponses: 0
    Dernier message: 16/04/2009, 12h35
  3. Partage de mémoire entre processus
    Par Didj7 dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 25/05/2008, 23h33
  4. Réponses: 1
    Dernier message: 05/02/2008, 15h36
  5. Partage de mémoire inter-processus en C#
    Par cinemania dans le forum Framework .NET
    Réponses: 1
    Dernier message: 11/04/2007, 19h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo