Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

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


Information sur la source

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é: 5 183 / 499

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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-AVANCEES-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-AVANCEES-SUR-FENETRES-PROCESSUS-WINDOWS-CPU_47970.aspx
--------------------------------
 

Fichier Zip

Pour les "Membres Club", vous pouvez 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

Commentaires et avis

signaler à un administrateur
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.

signaler à un administrateur
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.

signaler à un administrateur
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.

signaler à un administrateur
Commentaire de adamama le 09/08/2008 01:11:22 10/10

good job
;)

signaler à un administrateur
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!

signaler à un administrateur
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

signaler à un administrateur
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

signaler à un administrateur
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 URGENT !!! Comment récupérer le processeur (CPU) [ par kilyn ] J'aimerai récupérer le processeur par VB.Les valeurs doivent être du style "PII 400" ou "XP 2000" par exemple.Merci d'avance pour votre aide. 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

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,562 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.