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

API, COM et SDKs Delphi Discussion :

[D6] Processus - temps processeur


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut [D6] Processus - temps processeur
    Est-il possible de savoir si un processus est en train de travailler, ou est simplement actif ?

    En gros, si dans le gestionnaire des tâches, il y a une valeur supérieure à zéro dans la colonne processeur, ou pas.
    Je pense au processus de mise à jour de l'antivirus. J'aimerais savoir (au moment où j'interrogerais) si l'exe est en train de faire une mise-à-jour, ou s'il est simplement en attente.

    Une idée ?

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Tu as déjà GetProcessTimes pour les valeurs brutes, puis NdisGetCurrentProcessorCounts te donnera la formule à appliquer pour avoir la charge CPU (forcément approximative en mode User). Il te suffit en gros de sampler le processus pendant une brève période (disons 100 ms) pour avoir une estimation du pourcentage de CPU qu'il consomme.

    Tu dois pouvoir te contenter de deux samplings : un à T0 et un à T100 pour faire le calcul (récupérer le temps écoulé "exact" via QueryPerformanceCounter plutôt que par GetTickCount). Plus tu "testes" longtemps ton processus, plus le chiffre sera exact, reste à savoir le délai que tu estimes raisonnable pour lancer ton action (100 ms ? 500 ms ? 1 s ?)

    Autre solution, plus exacte mais peut-être plus lourde à mettre en place : Collecting Performance Data.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    pour ta réponse.
    Effectivement, ça m'a l'air de correspondre à ce que je cherche.
    Pour la procédure NdisGetCurrentProcessorCounts, je lis ici (http://msdn.microsoft.com/en-us/library/bb625382.aspx) que c'est défini dans Ndis.h. Mais, en Delphi je ne vois pas comment y accéder.
    J'imagine que cette procédure est accessible depuis une DLL windows, mais je n'ai pas trouvé laquelle (et je ne suis pas le seul http://www.developpez.net/forums/d68...ibrairie-ndis/).
    Tu n'aurais pas une idée ?

    Citation Envoyé par Mac LAK Voir le message
    Autre solution, plus exacte mais peut-être plus lourde à mettre en place : Collecting Performance Data.
    Pour cette solution, je n'ai pas compris.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par Lung Voir le message
    J'imagine que cette procédure est accessible depuis une DLL windows, mais je n'ai pas trouvé laquelle (et je ne suis pas le seul http://www.developpez.net/forums/d68...ibrairie-ndis/).
    Tu n'aurais pas une idée ?
    C'est une fonction kernel, tu ne peux pas y accéder. L'intérêt de cette fonction ne réside QUE dans la formule décrite dans son aide.
    Et pour les timings, tu utilises QueryPerformanceCounter + GetProcessTimes afin d'avoir le temps CPU du processus entre deux références temporelles, ce qui te permettra (via la formule précitée) d'obtenir la charge estimée du processus.

    Citation Envoyé par Lung Voir le message
    Pour cette solution, je n'ai pas compris.
    C'est la manière de lancer les analyseurs de performance Windows. C'est un poil complexe en effet, laisse tomber si tu ne t'en sens pas le niveau, au profit de la première solution.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    C'est une fonction kernel, tu ne peux pas y accéder. L'intérêt de cette fonction ne réside QUE dans la formule décrite dans son aide.
    Ah ok.

    CpuUsage = 100-100*(Idle - Idle[n])/(KernelAndUser - KernelAndUser[n]);
    Mais, il me manque le Idle.
    GetProcessTimes ne me le donne pas.

    Voilà où j'en suis :
    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
    37
    38
    39
    40
    41
    42
    var
       hProcessHandle: THandle;
       nDebut, nFin, nKernelTime1, nUserTime1, nKernelTime2, nUserTime2: Int64;
       lpCreationTime, lpExitTime, lpKernelTime, lpUserTime: _FILETIME;      // TFileTime
       lpsKernelTime, lpsUserTime: _SYSTEMTIME;
    begin
       hProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessEntry.th32ProcessID);
       try
          if not GetProcessTimes(hProcessHandle, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime) then
          begin
             Application.MessageBox(PChar('GetProcessTimes 1' + #13#10 + SysErrorMessage(GetLastError)), PChar(Caption + ' - erreur'), MB_ICONERROR + MB_OK);
             Exit;
          end;
          if not FileTimeToSystemTime(lpKernelTime, lpsKernelTime) then
             Exit;
          nKernelTime1 := (lpsKernelTime.wHour * 60 * 60 * 1000) + (lpsKernelTime.wMinute * 60 * 1000) + (lpsKernelTime.wSecond * 1000) + lpsKernelTime.wMilliseconds;
          if not FileTimeToSystemTime(lpUserTime, lpsUserTime) then
             Exit;
          nUserTime1 := (lpsUserTime.wHour * 60 * 60 * 1000) + (lpsUserTime.wMinute * 60 * 1000) + (lpsUserTime.wSecond * 1000) + lpsUserTime.wMilliseconds;
    
          //.Pause (nano-secondes).
          QueryPerformanceCounter(nDebut);
          repeat
             QueryPerformanceCounter(nFin);
          until((nFin - nDebut) > 5000000);
    
          if not GetProcessTimes(hProcessHandle, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime) then
          begin
             Application.MessageBox(PChar('GetProcessTimes 2' + #13#10 + SysErrorMessage(GetLastError)), PChar(Caption + ' - erreur'), MB_ICONERROR + MB_OK);
             Exit;
          end;
          if not FileTimeToSystemTime(lpKernelTime, lpsKernelTime) then
             Exit;
          nKernelTime2 := (lpsKernelTime.wHour * 60 * 60 * 1000) + (lpsKernelTime.wMinute * 60 * 1000) + (lpsKernelTime.wSecond * 1000) + lpsKernelTime.wMilliseconds;
          if not FileTimeToSystemTime(lpUserTime, lpsUserTime) then
             Exit;
          nUserTime2 := (lpsUserTime.wHour * 60 * 60 * 1000) + (lpsUserTime.wMinute * 60 * 1000) + (lpsUserTime.wSecond * 1000) + lpsUserTime.wMilliseconds;
    
          _dTempsProcesseur := 100 - 100 * ( ? ) / (nKernelTime1 + nUserTime1) - (nKernelTime2 + nUserTime2);
       finally
          CloseHandle(hProcessHandle);
       end;
    Sinon, le jonglage entre les _FILETIME et les _SYSTEMTIME, c'est pas simple.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par Lung Voir le message
    Mais, il me manque le Idle.
    Tu peux l'obtenir avec GetLastInputInfo, c'est expliqué dans l'aide de la structure passée en paramètre.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  7. #7
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Si tu veux juste scanner un processus donné, tu peux tout simplement ne pas threader ça, et faire une attente d'environ 500 à 1000 ms, et vérifier le résultat.

    Mais il me semblait que tu voulais vérifier une application à partir d'une autre application, c'est pour cela que je te parlais d'un thread plutôt que d'une attente "active" comme le ferait un petit utilitaire en ligne de commande.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. [Batch] [Technique] Processus , Temps , Messages
    Par sokai dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 14/10/2009, 08h40
  2. Récuper le temps processeur d'un processus
    Par KRis dans le forum Langage
    Réponses: 1
    Dernier message: 15/01/2009, 04h33
  3. 4Dclient - Utilisation du temps processeur
    Par clem9 dans le forum 4D
    Réponses: 4
    Dernier message: 19/09/2008, 09h34
  4. [SOLARIS] Consommation processus temps reel
    Par droussa dans le forum Solaris
    Réponses: 2
    Dernier message: 26/06/2007, 18h46
  5. [C#] "Access is denied" pour récupérer le temps processeur
    Par xtream dans le forum Windows Forms
    Réponses: 1
    Dernier message: 22/06/2006, 01h02

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