begin process at 2012 02 04 11:44:03
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Système

 > CPU LIMITER - LIMITEZ L'UTILISATION DU PROCESSEUR DE CHAQUE PROCESSUS

CPU LIMITER - LIMITEZ L'UTILISATION DU PROCESSEUR DE CHAQUE PROCESSUS


 Information sur la source

Note :
10 / 10 - par 3 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Système Classé sous :cpu, vbsyslib, processus, process, processeur Niveau :Expert Date de création :02/08/2008 Date de mise à jour :16/09/2008 13:00:20 Vu / téléchargé :9 290 / 780

Auteur : MadM@tt

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
--------------------------------
MAJ : Une version plus complète de ce programme existe :
http://www.vbfrance.com/codes/WIN-OPTIONS-AVANCE ES-SUR-FENETRES-PROCESSUS-WINDOWS-CPU_47970.aspx
- -------------------------------

N'avez vous jamais eu envie de limiter l'utilisation CPU d'un processus à quelques %, histoire de pouvoir faire tourner une tache de fond sans qu'elle ne gène l'exécution d'autres taches, qu'elle ne fasse pas chauffer l'ordinateur ou qu'elle n'épuise pas la batterie en quelques minutes ?
Autre exemple : pourquoi un vieux jeu qui tournait très bien sur un pentium II à 266MHz nécessite 100% du temps processeur sur votre pentium IV ?

Voilà ce que permet ce petit programme, dont je n'ai trouvé aucun équivalent sous Windows (pour l'instant).

Il se loge dans le system tray en tache de fond, et vous propose une liste des processus tournant sur votre système. D'un simple clic, vous pouvez limiter l'utilisation CPU de chaque processus individuellement.

Test :
Le projet contenu dans le dossier Test permet de générer un programme qui utilisera le CPU à 100% (sans toutefois bloquer le système !). Vous pourrez alors tester CPU Limiter sur ce programme.


 Conclusion

Ce programme a été développé en utilisant la VB System Library (VbSysLib) :
http://vbsystemlibrary.free.fr/
C'est une librairie pour Visual Basic offrant des fonctions pour agir sur le système. Je ne peux que vous la conseiller ;-)

En espérant que ça vous serve...

MadMatt


------------------------------ --
MAJ : Une version plus complète de ce programme existe :
http://www.vbfrance.com/codes/WIN-OPTIONS-AVANCE ES-SUR-FENETRES-PROCESSUS-WINDOWS-CPU_47970.aspx
- -------------------------------

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

16 septembre 2008 13:00:22 :
MAJ : Une version plus complète de ce programme existe : http://www.vbfrance.com/codes/WIN-OPTIONS-AVANCEES-SUR-FENETRES-PROCESSUS-WINDOWS-CPU_47970.aspx

 Sources du même auteur

Source avec Zip COMMUNICATION INTER-PROCESSUS (IPC)
Source avec Zip OPÉRATIONS SUR LES CHAINES DE CARACTÈRE OPTIMISÉES ET ÉTENDU...
Source avec Zip Source avec une capture FISHTANK - SCREENSAVER INTERACTIF : AQUARIUM AVEC POISSONS V...
Source avec Zip Source avec une capture RÉCUPÉRER LA TEMPÉRATURE DES DISQUES DURS
Source avec Zip Source avec une capture WIN++ OPTIONS AVANCÉES SUR LES FENETRES ET PROCESSUS WINDOWS...

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) CLONE/FORK DES FLUX DE LA CONSOLE : PERMETTRE LA REDIRECTION... par ShareVB
Source avec Zip Source .NET (Dotnet) DÉFRAGMENTER UN FICHIER par ShareVB
Source avec Zip Source .NET (Dotnet) ECRAN DE VEILLE : DÉTECTER LE LANCEMENT/DÉCLENCHER/EMPÊCHER par ShareVB
Source avec Zip Source avec une capture DESACTIVER / ACTIVER LES MISES EN VEILLES PC par Arsena
Source avec Zip Source avec une capture FLÉCHES DES ICONES DU BUREAU par Sechaud

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) YET ANOTHER (REMOTE) PROCESS MONITOR par violent_ken
Source avec Zip Source avec une capture WIN++ OPTIONS AVANCÉES SUR LES FENETRES ET PROCESSUS WINDOWS... par MadM@tt
Source avec Zip Source avec une capture CLM'S EMERGENCY : REFROIDISSEUR DE CPU par clementio
Source avec Zip Source avec une capture PROCESSVIEWER VBSYSLIB - UN VISUALISATEUR DE PROCESSUS COMPL... par VB System Library
Source avec Zip Source avec une capture CLASSE POUR RÉCUPERER L'UTILISATION CPU D'UN PROCESSUS par draluorg

Commentaires et avis

Commentaire de MPi le 03/08/2008 10:35:09

Salut MadM@tt,

Tu viens de toucher une de mes cordes sensibles... :)

Au bureau, j'utilise justement une application qui prend 100% du CPU, ce qui occasionne des problèmes lorsqu'on veut utiliser d'autres applis comme Excel ou Outlook... Je dois donc utiliser 2 ordis pour être efficace.

Est-ce à dire que ton programme pourrait limiter mon application gourmande à utiliser seulement 50% du CPU, disons, et laisser un peu de place pour les autres applis ? Et est-ce que ça ne nuira pas au rendement de cette application ?

Intéressant, en tout cas, comme projet.

Commentaire de MadM@tt le 03/08/2008 12:40:48

Ah content que ça puisse intéresser quelqu'un.

Alors oui, ça pourrait faire ce que tu veux : à savoir limiter ton appli gourmande à 50% maximum d'utilisation CPU. Par contre ça influe forcément sur le rendement de cette application : à 50%, elle sera 2 fois moins productive.

Mais ton problème ne pourrait-il pas être (en partie) réglé en définissant ton processus à une priorité faible, comme ça ça ne gênerait pas l'exécution d'autres taches ? Après, si tu veux vraiment que son exécution soit transparente tu peux utiliser en complément mon programme, pour être sur qu'il y'aura toujours du temps processeur de libre pour n'importe quelle autre appli... A voir.

Commentaire de killer123456789 le 03/08/2008 16:28:04

Félicitation! Très bon programme. Justement je cherchais un programme de ce genre pour laisser rouler un programme sur mon ordi sans que celui-ci utilise 100% du CPU mais j'avais pas trouver de programme semblable au tien.

Commentaire de adamama le 09/08/2008 01:11:22 10/10

good job
;)

Commentaire de zavier666 le 12/09/2008 21:33:12 10/10

Si il y avait une élection du code de l'année, je crois que l'on tiendrait le gagnant et de loin. Il faut absolument que tu compiles et que tu distribues. J'ai longtemps cherché et même pensé que cela n'étais pas possible!

Commentaire de MadM@tt le 13/09/2008 20:59:57

Merci pour les compliments !

Concernant la version compilée avec un installeur, c'est déjà fait :
http://www.mnapoli.fr/programmes/cpulimiter.php

Commentaire de MadM@tt le 16/09/2008 13:01:02

Pour ceux que ça intéresse, une version plus complète est disponible ici :
http://www.vbfrance.com/codes/WIN-OPTIONS-AVANCEES-SUR-FENETRES-PROCESSUS-WINDOWS-CPU_47970.aspx

Commentaire de Fraer9 le 03/02/2009 15:22:48 10/10

Merci pour ce code !

Voici la meme chose en c#, c'est une variante plus simple (qu'un seul timer) a utiliser avec l'api JobObjectWrapper (voir http://www.codeplex.com/JobObjectWrapper) pour la limitation d'un ensemble de processus (1 limite pour n processus).

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Timers;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Process[] par = Process.GetProcessesByName("ProcessLauncher");
            CPULimiter cpuLimiter = new CPULimiter(10);

            cpuLimiter.addProcessToWatchList(par[0]);

            // Wait a little
            System.Threading.Thread.Sleep(5000);

            cpuLimiter.addProcessToWatchList(par[1]);

            Console.ReadLine();
        }
    }

    class ProcessWatcher
    {
        private readonly Process _watchedProcess;
        private readonly PerformanceCounter _performanceCounter;
        private bool _isSuspended;

        public ProcessWatcher(Process processToWatch)
        {
          this._watchedProcess = processToWatch;
          this._performanceCounter = new PerformanceCounter(
                    "Process",
                    "% Processor Time",
                    processToWatch.ProcessName);
          // Init the perf counter
          this._performanceCounter.NextValue();            
          this._isSuspended = false;
        }

        public Process watchedProcess
        {
            get { return this._watchedProcess; }
        }

        public PerformanceCounter performanceCounter
        {
            get { return this._performanceCounter; }
        }

        public bool isSuspended
        {
            get { return this._isSuspended; }
            set { this._isSuspended = value; }
        }
    }

    class CPULimiter
    {
        [DllImport("ntdll.dll", EntryPoint = "NtResumeProcess", SetLastError = true)]
        private static extern uint NtResumeProcess(IntPtr processHandle);

        [DllImport("ntdll.dll", EntryPoint = "NtSuspendProcess", SetLastError = true)]
        private static extern uint NtSuspendProcess(IntPtr processHandle);
        
        // see if 1sec based rate in ms is not too often
        public const int REFRESH_RATE_BASE_MS = 100;

        private readonly List<ProcessWatcher> watchList;

        private readonly float maxCpuUsagePercetage;
        private readonly Timer watchingTimer;

        public CPULimiter(int maxCpuUsagePercentageBase100)
        {
            // Initialize the list
            this.watchList = new List<ProcessWatcher>();
            // Convert to processor count based percentage
            this.maxCpuUsagePercetage = maxCpuUsagePercentageBase100 * Environment.ProcessorCount;
            // Create the watching timer
            this.watchingTimer = new Timer();
            // Hook up the Elapsed event for the timer.
            this.watchingTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
            // Set the timer refresh rate
            this.watchingTimer.Interval = REFRESH_RATE_BASE_MS;            
        }

        public void addProcessToWatchList(Process processToWatch)
        {
            // Stop the timer...
            this.watchingTimer.Enabled = false;
            // Add this watcher to the watch list
            this.watchList.Add(new ProcessWatcher(processToWatch));
            // Restart the timer      
            this.watchingTimer.Enabled = true;
        }

        // Executed by a timer every REFRESH_RATE_BASE_MS        
        public void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            // Manually stop the timer...            
            this.watchingTimer.Enabled = false;            
            // Save the last exceeding cpu usage
            float lastExceedingCpuUsage = 0;
            bool cpuUsageLimitExceeded = false;
            for (int i = this.watchList.Count - 1; i >= 0; i--)
            {
                ProcessWatcher processWatcher = this.watchList[i];
                // Check if the process has exited
                if (processWatcher.watchedProcess.HasExited)
                {
                    // Remove this process watcher from the watch list
                    this.watchList.RemoveAt(i);
                }
                else
                {
                    // If the process is suspended resume it
                    if (processWatcher.isSuspended)
                    {
                        // Re init the perf counter since the process was suspended
                        processWatcher.performanceCounter.NextValue();
                        if (NtResumeProcess(processWatcher.watchedProcess.Handle) == 0)
                        {
                            processWatcher.isSuspended = false;
                        }
                        else
                        {
                            // Something bad happended so remove this watcher
                            this.watchList.RemoveAt(i);
                        }                        
                    }
                    else
                    {
                        lastExceedingCpuUsage = processWatcher.performanceCounter.NextValue();
                        if (lastExceedingCpuUsage > this.maxCpuUsagePercetage)
                        {
                            //Console.WriteLine("Process reached the limit Process:{0} CPU% {1}", processWatcher.performanceCounter.InstanceName, lastExceedingCpuUsage);
                            cpuUsageLimitExceeded = true;
                            break;
                        }
                    }
                }
            }

            int nextInterval = REFRESH_RATE_BASE_MS;

            // If cpu usage has been reached
            if (cpuUsageLimitExceeded)
            {
                for (int i = this.watchList.Count - 1; i >= 0; i--)
                {
                    ProcessWatcher processWatcher = this.watchList[i];
                    // Check if the process has exited
                    if (processWatcher.watchedProcess.HasExited)
                    {
                        // Remove this process watcher from the watch list
                        this.watchList.RemoveAt(i);
                    }
                    else
                    {
                        // Since some process watchers can already be suspended we need to check the state
                        if (!processWatcher.isSuspended)
                        {
                            // Suspend the process
                            if (NtSuspendProcess(processWatcher.watchedProcess.Handle) == 0)
                            {
                                processWatcher.isSuspended = true;
                            }
                            else
                            {
                                // Something bad happended so remove this watcher                                
                                this.watchList.RemoveAt(i);
                            }
                        }
                    }
                }
                // Compute the time to wait in order to reach the given percentage
                // formula : TimeToWait = BASE * ((previous_percentage / wanted_percentage) - 1)
                nextInterval = Convert.ToInt32(REFRESH_RATE_BASE_MS * ((lastExceedingCpuUsage / this.maxCpuUsagePercetage) - 1));
                if (nextInterval < 20) {            
                    nextInterval = 20;
                }                
            }
            
            // Change the next start            
            this.watchingTimer.Interval = nextInterval;
            this.watchingTimer.Enabled = true;
        }
    }
}

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Pourcentage d'un processus thread ou process CPU [ par DavidT ] Comme le gestionnaire de tache, il existe la possibilité de de visualiser sur un système NT la mémoire physique consommée par un process déterminé par Tester présence d'un process + tester fin d'un process [ par lionel4 ] Voila je cherche deux trucs. Un code pour tester si un processus est en cours, et un autre pour detecter la fin d'un processus.Merci !Lionel4 - Débuta utilisation cpu par processus [ par Adidas2 ] salut tous le mondequelqu'un aurait une idée de où chercher pour trouver l'utilisation processeur de chaque processus lancé (un peu comme dans le ctrl utilisation cpu par processus [ par Adidas2 ] Salut tous le mondeJe cherche à obtenir l'utilisation CPU de chaque processus lancé quelqu'un aurait une idée de la fonction à utiliser svp ?Langage : lancer une appli à distance avec winmgmts [ par centralvince ] Voilà, j'ai réussi à lancer un processus à distance comme cela :Set process = GetObject("winmgmts:{impersonationLevel=impersonate}!//ordianateur_dista Process et threads en .NET [ par mastercatz ] Je voulais savoir comment on peut detecter la création d'un processus. Par exemple, dans mon prog a un moment il est question d'enregistrer le PID d'u charge CPU par process [ par imations57 ] Salut a tousje cherche je cherche mais je ne trouve pas alors je fait appel aux experts de VBFRANCE qui ont toujours reponse a toutJe cherche a savoir Utilisation CPU d'un processus [ par MadM@tt ] J'ai eu beau cherché je n'ai pas trouvé comment faire pour récupérer le pourcentage d'utilisation CPU de chaque processus (comme dans le Ctrl Alt Supr Timed CPU PROCESS killer [ par sammuelsan ] Salut, Quelqu'un pourrait me dire s'il existe un logiciel qui permet de mettre un timer sur un process ? Je m'explique, un logiciel qui tue un proce


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,764 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales