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

Delphi Discussion :

utilisation cpu et mémoire


Sujet :

Delphi

  1. #1
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut utilisation cpu et mémoire
    bon voilà, j'ai un petit soucis et aucune idée de comment faire:

    j'ai un noyau de calcul (en fortran) et une ihm (en delphi) le truc que je veut faire c'est que pendant que le noyau tourne (et il tourne bien ) l'ihm m'affiche l'utilisation du cpu et de la mémoire (bon on utilise les timer... bla bla...) mon soucis: comment récupérer ces valeurs....

    plusieur cas: sous windaube et sous unix:
    -sous windaube, mon noyau de calcul utilise cygwin (et oui ça merche mieux quand même) mais apparait directement dans le task manager (avec ses valeur de cpu et mem) quel est la méthode (utilisant le moins de CPU) pour récupérer ces valeurs
    soit directement à partir de win ou en passant par cygwin(je sais peut-être y a-t-il la fonction avec)

    -sous linux: même question (en priant pour que cela ne dépende pas de la distro)

    P.S. sous windaube, je n'utilise que la dll cygwin1.dll, je suppose que le PATH de win est à jour pour comprendre toutes les instructions cygwin et je lance directement mon prog depuis n'importe quel shell ou via l'ihm (shellexecute... etc...)

    merci pour vos réponses et à bientôt...
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Voiçi déjà un petit bout pour récupérer des infos sur la mémoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TfrmGen.Memoire1Click(Sender: TObject); // ici une consultation occasionelle par click sur un bouton
    var       MS: TMemoryStatus; MemPhys,MemOccu,MemDisp,msg : string;
    begin     GlobalMemoryStatus(MS);          
                MemPhys:='- Total : '+FormatFloat('#,###" Ko"', MS.dwTotalPhys / 1024);
                MemDisp:='- Dispo : '+FormatFloat('#,###" Ko"', MS.dwAvailPhys / 1024);
                MemOccu:='- Occup : '+ Format('%d %%', [MS.dwMemoryLoad]);
                msg:='Mémoire'+#13#10;
                msg:=msg+MemPhys+#13#10;
                msg:=msg+MemOccu+#13#10;
                msg:=msg+MemDisp+#13#10;
                ShowMessage(msg);
    end;
    ... pour + de détails voir Aide Delphi au mot-clef MemoryStatus.
    ... et pour le reste de ton message : j'ai rien pigé mais c'est pas grave.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    bon en fait le truc c'est que je veux récupéré les infos mémoires et CPU d'un processus en cours (le gui qui récupère les états d'occupation memoire et CPU du core) en fait j'ai deux programmes que l'on nommera "gui.exe" et "core.exe"

    ensuite, je doit leS faires marcher sous deux système: unix (kylix...) et windows+cygwin(emulateur unix)

    donc je suppose qu'il faut récupérer le PID du processus core.exe puis relever la memoire qu'il occupe et le %UC qu'il utilise

    (le core.exe est un code de calcul et l'idée c'est de relevé tous les dT donnés sont état mémoire et CPU puis d'en faire un graph, en gros je veux juste les infos d'un process) et comme je suppose que cela relève de l'OS, je précise que y en a plusieur possible (pas en même temps évidement)
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  4. #4
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    j'utilise delphi7 et g rien trouvé dans l'help s'approchant de près ou de loin à ce que tu dit, ni à la gestion des processus en cours d'exécution....

    la question reste ouverte
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    J'ai mieux pigé le problème à résoudre : Récupérer des infos provenant d'un côté d'Unix et de l'autre côté de Windows.
    Unix, connais pas.
    Par contre Delphi peut au moins récupérer les infos relatives à l'occupation-mémoire du côté Windows via la routine GlobalMemoryStatus qui existe sous Delphi 5 et voiçi le début de l'aide qui répond chez moi à l'appel du mot-clef MemoryStatsus vu que tu dis "j'utilise delphi7 et g rien trouvé dans l'help s'approchant de près ou de loin à ce que tu dit" :

    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
    The MEMORYSTATUS structure contains information about current memory availability. The GlobalMemoryStatus
     function uses this structure. 
     
    typedef struct _MEMORYSTATUS { // mst  
        DWORD dwLength;        // sizeof(MEMORYSTATUS) 
        DWORD dwMemoryLoad;    // percent of memory in use 
        DWORD dwTotalPhys;     // bytes of physical memory 
        DWORD dwAvailPhys;     // free physical memory bytes 
        DWORD dwTotalPageFile; // bytes of paging file 
        DWORD dwAvailPageFile; // free bytes of paging file 
        DWORD dwTotalVirtual;  // user bytes of address space 
        DWORD dwAvailVirtual;  // free user bytes 
     
    } MEMORYSTATUS, *LPMEMORYSTATUS;
    Pour la suite (assez longue) de l'aide, voir directement l'aide.
    Je serais surpris d'apprendre que ce qui marche sous D5 ne marcherait plus sous D7 (!?!?).

    Par contre, pour le reste, la question reste largement ouverte.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  6. #6
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    Merci, on s'approche, fallait pas regardé dans l'help de delphi mais dans celle du windows SDK.... ça y est j'ai trouvé la page....

    bon dison que je me concentre pour l'instant sur windows....

    le MEMORYSTATUS me donne l'occupation global de la mémoire moi je veut que celle de mon processus core.exe... de plus pour avoir les infos cpu, y le SYSTEM_INFO etc....

    déjà, première étape: identifier le processus visé parli les autres (trouvé sont PID entre autre) ensuite il doit bien y avoir un moyen de récupérer son occupation mémoire et CPU (exactement comme dans le task manager de windows)

    en tout cas merci gil, tu m'a mis sur la bonne help... mais j'ai pas encore résolu mon problème...
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    le MEMORYSTATUS me donne l'occupation global de la mémoire moi je veut que celle de mon processus core.exe
    Suggestion : Et si je crée un micro-programme nommé LanceMoiCore et qui ne fait que trois choses :
    1 - Récupérer d'abord l'occupation-mémoire avant de lancer core.exe,
    2 et 3 - lancer core.exe avec transmission en paramètre de l'info donnant à core le "NiveauDoccupationMémoireZéro" cela permettrait de demander à core d'envoyer épisodiquement le "DeltaDoccupationMémoire" sur une lucarne d'affichage (si cette info ne bouge pas trop rapidement) ou vers un truc qui enregistre les Deltas-Mémoire successifs, truc pouvant désigner par exemple un RichEdit auquel on dit toutes le X secondes RicheEdit.lines.add('Top-Départ Action n°Tant'+IntToStr(DeltaDoccupationMémoire)+'Ko, Mo, ou Go'),

    ... cela fournirait bien l'occupation-mémoire du processus core.exe, non?
    ... par contre en disant ceci je suppose que core.exe est une appli Delphi dont on dispose du code pour pouvoir y insérer quelques instructions. Sinon il faudra que ce soit le micro-programme LanceMoiCore qui devra assurer non seulement le lancement mais également le suivi de l'occupation mémoire en agissant comme un logiciel résident par exemple.

    mais j'ai pas encore résolu mon problème
    ... en le découpant en rondelles de plus en plus fines on devrait pouvoir le digérer, sans oublier qu'on n'est pas les seuls à fréquenter ce forum.
    Peut-être qu'il faut appeler à l'
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  8. #8
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    alors précision: le gui est en delphi, le core en fortran, j'ai les codes des deux car c'est moi qui les ait écrit, je peux changer ce que je veux (dans la limite des languages et compilo évidement...)

    bon on découpe en rondelle... pas con....
    je me concentre sur l'occupation mémoire sous windows.
    ta solution est pas bête mais cela me donne que la mémoire utilisée au lancement du prog or le core est un code de calcul qui fait un peu comme les camenbert: il s'étale... j'aimerai avoir l'évolution.... je pourrais appelé une nouvelle fois la comparaison mais si d'autre applis sont lancée entre temps cela fausse le calcul...

    en fouillant un peu le windows sdk dans l'aide delphi, j'ai touvé la fonction CreateProcess permettant normalement (car j'arrive pas à le faire marché comme je veux) de lancer un nouveau processus qui lance l'application voulue, cela permet entre autre d'avoir le PID de mon core
    je voulais donc remplacer le 'ShellExecute' par cette fonction malheureusement cela ne marche pas tout à fait....

    je cherche encore....
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    mais si d'autre applis sont lancée entre temps cela fausse le calcul...
    Effectivement, mais là je cale ... sauf que le problème serait réglé si on pouvait empêcher de lancer ces autres applis le temps de faire les mesures, de même que si on peut faire les mesures à une heure où personne ne lance une autre appli.

    Au fait, as-tu suivi la discussion intitulée Evaluer la charge d'un pc qui vient d'être switchée sur "résolu" à l'instant ? Comme elle concerne "le cadre d'une appli qui tourne sur plusieurs serveurs, où le demandeur cherche à évaluer la charge (% cpu) de la machine" et il y est question d'un vumètre cpu avec 2 liens vers du code-source qui pourrait contenir des trucs pouvant te donner des idées pour avancer dans tes recherches.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    si tu possede le process ID du programme tu peux savoir la memoire
    qu'il utilise...
    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
     
    //==============================================================================
    //=== Détermine la quantité de mémoire utilisé par le process ID.
    //=== Uses psapi
    //==============================================================================
    Function ProcessMemoryUsage(ProcessID: DWORD): DWORD;
    Var
      ProcessHandle: THandle;
      MemCounters: TProcessMemoryCounters;
    Begin
      Result := 0;
      ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION Or
        PROCESS_VM_READ, false, ProcessID);
      Try
        If GetProcessMemoryInfo(ProcessHandle, @MemCounters, //<--correction ici
          sizeof(MemCounters)) Then
          Result := MemCounters.WorkingSetSize;
      Finally
        CloseHandle(ProcessHandle);
      End;
    End;
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  11. #11
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    gil, j'ai vu le topic sur le vumetre cpucela reste trop global en fait pour mon cas de figure... c'est bien domage

    Eric c magique!!!! bah c'est exactement ça!!! il me faut plus maintenant que trouvé l'eéquivalent pour CPU et un moyen d'avoir le PID de mon process????

    à ce propos... pour le moment, mon process est lancé via shellexecute est-ce que cette commande permet de récupérer le PID du prog? ou bien y a t il une autre commande pour lancer une appli qui donne ce PID ou faut-il le rechercher après (avec le nom du processus par exemple)?
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  12. #12
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    un moyen d'avoir le PID de mon process????
    Télécharges donc le fichier Fermer0070.zip à l'adresse suivante : http://nono40.developpez.com/sources/source0070
    Son code permet de lister les process en cours et d'en fermer un à la fois.
    Il t'affiche sur la première colonne le handle d'Identification de chaque Process et sur la seconde le nom de l'exe ou de la dll ... reste plus, par exemple, qu'à convertir ce handle de l'Hexa en DWORD et d'ajouter le code d'Eric Boisvert pour afficher sur une 3ème colonne la mémoire squattée par chaque process ... ou d'accomoder tout ceci en fonction des besoins.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  13. #13
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par genteur slayer
    à ce propos... pour le moment, mon process est lancé via shellexecute est-ce que cette commande permet de récupérer le PID du prog? ou bien y a t il une autre commande pour lancer une appli qui donne ce PID ou faut-il le rechercher après (avec le nom du processus par exemple)?
    CreateProcess est ton ami!

    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
    43
    44
    45
    46
    47
    48
     
     
    //==============================================================================
    //=== Lance une application et retourne le process ID
    //==============================================================================
    Function StartAndGetProcessID(Command: String): DWord;
    Var
      lpsaProcess: PSecurityAttributes;
      lpsaThread: PSecurityAttributes;
      StartupInfo: TStartupInfo;
      ProcessInfo: TProcessInformation;
      AddrCmd: Array[0..255] Of Char;
      ReturnValue: BOOL;
    Begin
      FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
      With StartupInfo Do
      Begin
        cb := SizeOf(TStartupInfo);
        dwFlags := STARTF_USESHOWWINDOW;
        wShowWindow := SW_SHOW;
      End;
     
      New(lpsaProcess);
      New(lpsaThread);
      Try
        lpsaProcess^.nLength := SizeOf(lpsaProcess^);
        lpsaProcess^.lpSecurityDescriptor := Nil;
        lpsaProcess^.bInheritHandle := True;
     
        lpsaThread^.nLength := SizeOf(lpsaThread^);
        lpsaThread^.lpSecurityDescriptor := Nil;
        lpsaThread^.bInheritHandle := True;
     
        StrPCopy(AddrCmd, Command);
        ReturnValue := CreateProcess(Nil, AddrCmd, lpsaProcess, lpsaThread, False,
          0, Nil, Nil, StartupInfo, ProcessInfo);
      Finally
        Dispose(lpsaProcess);
        Dispose(lpsaThread);
      End;
      result := 0;
      If ReturnValue Then
      Begin
        result := ProcessInfo.dwProcessId;
      End;
      CloseHandle(ProcessInfo.hThread);
      CloseHandle(ProcessInfo.hProcess);
    End;
    Citation Envoyé par genteur slayer
    il me faut plus maintenant que trouvé l'eéquivalent pour CPU
    Effectivement...mais pour cette partie... ce sera plus difficile je crois...
    j'ai aucune idée comment obtenir le %CPU d'un Process mais c'est sûrment
    possible puisque le task manager le fait...
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  14. #14
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    merci tout le monde!!!
    j'avais déjà découvert le CreateProcess mais j'avais pas toute la procedure de lancement, merci!!
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  15. #15
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    Bon j'ai pu bien tout testé maintenant que je suis revenu au boulot.... pour le lancement du process ça marche super bien (il me donne le bon PID et tout) donc cette partie là est bien règlé

    maintenant pour la partie mémoire, déjà j'ai des erreurs de compilation si je le laisse comme eric me le donne ([Error] Main.pas(381): Incompatible types: '_PROCESS_MEMORY_COUNTERS' and 'PPROCESS_MEMORY_COUNTERS')

    mais en déclarant MemCounters comme un PPROCESS_MEMORY_COUNTERS pas d'erreur de compilation mais il me donne en permanance 0 utilisation mémoire

    de plus j'arrive pas à avoir des infos solides sur TProcessInfo et createprocess en tout cas à avoir plus que la simple syntaxe.... si vous avez des pistes....
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  16. #16
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Desolé j'avais une petite erreur dans le poste précédent...
    il faut simplement passé l'adresse de MemCounters en ajoutant @....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If GetProcessMemoryInfo(ProcessHandle, @MemCounters,
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  17. #17
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    yep cette fois c'est parfait!!!! j'ai l'utilisation de la mémoire en temps réel!!!
    merci beaucoup (comme je suis pas expert en delphi j'avais pas fait le rapprochement pointeur-donnée mais maintenant cela me parais évident)

    c'est toute fois bien dommage qu'il y ait pas une p'tite fonction 'GetProcessCPUInfo'.....
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  18. #18
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    Bon en cherchant un peu du coté MSDN, j'ai écris cette fonction:

    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
    function ProcessCPUUsage(ProcessID : DWORD): TCPUPourcentage;
    var
      ProcessHandle : THandle;
      TimeCr,TimeEx,TimeKer,TimeUser :FileTime;
      STimeKer,STimeUser :SystemTime;
      stime:SystemTime ;
      itvalS,itvalKer,itValUser:DWord;
      Pourc  :TCPUPourcentage;
    begin
      Pourc.pKernel:=0;
      Pourc.pUser:=0;
      result:=Pourc;
      ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, ProcessID );
      try
       if GetProcessTimes(ProcessHandle,TimeCr,TimeEx,TimeKer,TimeUser)then begin
         //convertion du temps en systemTime
         FileTimeToSystemTime(TimeCr,STimeCr);
         FileTimeToSystemTime(TimeKer,STimeKer);
         FileTimeToSystemTime(TimeUser,STimeUser);
         //récupération du temps systeme
         GetSystemtime(stime);
         // comparaison avec l'appel précédent
         itvalS:=CompTime(sstime,stime);
         itvalKer:=CompTime(sstimeker,stimeker);
         itvalUser:=CompTime(ssTimeUser,sTimeUser);
         // mise à jour des variables globales:
         sstime:=stime;
         sstimeker:=stimeker;
         ssTimeUser:=sTimeUser;
         //calcul des pourcentages user et kernel:
         Pourc.pKernel:=(itValKer*100)/itValS;
         Pourc.pUser:=(itValUser*100)/itValS;
         result:=Pourc;
       end;
      finally
       CloseHandle(ProcessHandle);
      end;
    end;
    avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TCPUPourcentage = record
        pKernel : real;
        pUser   : real;
      end;
    et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function comptime(a:SystemTime;b:SystemTime):DWORD;
    var temp:integer ;
    begin
      temp:=(a.wYear-b.wYear)*31536000000;//conversiontion d'une année en milisecondes
      temp:=Temp+(a.wMonth-b.wMonth)*2628000000;//un mois = 1/12 d'année (pour simplifié)
      temp:=temp+(a.wDay-b.wDay)*86400000;//calcul exact du nombre de mlli dans un jour
      temp:=temp+(a.wHour-b.wHour)*3600000;
      temp:=temp+(a.wMinute-b.wMinute)*60000;
      temp:=temp+(a.wSecond-b.wSecond)*1000;
      temp:=temp+(a.wMilliseconds-b.wMilliseconds);
      result:=temp;
    end;
    il y a quelques variables globale pour pouvoir garder en mémoire l'étape d'avant....

    cependant, cela me sort à chaque fois 0.9% ou 0% pour l'un et/ou le temp kernel et user.

    c'est où que j'ai merdé? (pour parlé mal) est que cette fonction "GetProcessTimes" me donne bien ce que je pense à savoir le temps d'exécution du programme depuis sont lancement?

    note: mon timer est reglé sur 1000millisecondes.
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  19. #19
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    bon j'ai trouvé le problème (il fallait callé des abs() dans le calcul de comptime), j'ai maintenant une évolution mais deux soucis encore:

    -la première c'est général, mais quel est la différence entre le temp user et le temps kernel, et quel est celui afficher par Taskm.exe ou time (sous unix)

    -la seconde: j'ai bien des valeurs mais très instables: je suis sur une machine 8 processeurs (je passe le détail) mon code tourne sur un seul donc en théorie mon occupation cpu ne peut dépassé 12.5% (ce qui est confirmé en regardant taskm.exe) or mon code donne de fortes oscilation (dépassant même les 100% par moment) du coup ça fait des graph un peu moche même en faisant la moyenne des valeurs deux par deux.....

    est-ce que quelqu'un a une idée d'où peut venir ces instabilités?
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  20. #20
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Et bien vite de même je dirais que ton timer est imprécis...
    et dans tes calcules tu considère qu'il est toujours précis à 1000 milisec?
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

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

Discussions similaires

  1. Connaitre l'utilisation CPU/mémoire
    Par Flophx dans le forum Administration système
    Réponses: 5
    Dernier message: 09/02/2007, 11h40
  2. Utilisation cpu
    Par flzox dans le forum MATLAB
    Réponses: 2
    Dernier message: 19/05/2006, 14h05
  3. Question Utilisation cpu
    Par devdev2003 dans le forum Administration système
    Réponses: 4
    Dernier message: 03/12/2005, 17h01
  4. Utilisation de la mémoire
    Par jagboys dans le forum MFC
    Réponses: 1
    Dernier message: 12/11/2005, 16h30
  5. Utilisation de la mémoire vive....
    Par Neilos dans le forum Windows
    Réponses: 9
    Dernier message: 24/11/2003, 11h09

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