J'ai une application avec une fuite GDI qui finira par atteindre 10 000 objets GDI alloués et se planter. J'ai essayé d'augmenter le GDIProcessHandleQuota à 20 000, mais le programme s'est toujours planté lorsqu'il a atteint 10 000 objets. Nous travaillons actuellement sur Parcheando cette fuite, mais par curiosité - existe-t-il un moyen d'augmenter la limite GDI pour un seul processus ? Ou est-ce que 10k est une limite dure d'une application individuelle ?
Réponses
Trop de publicités?10K est une limite difficile.
Les objets GDI représentent des ressources d'interface de périphérique graphique comme les polices, les bitmaps, les brosses, les stylos et les contextes de périphérique (surfaces de dessin). Comme pour les objets USER, le gestionnaire de fenêtres limite les processus à un maximum de 10 000 objets GDI [...]
Mark Russinovich a une série d'articles qui traitent en profondeur des différentes limites de Windows. Ces deux articles pourraient vous être utiles :
- Repousser les limites de Windows : Objets USER et GDI - Partie 1
- Repousser les limites de Windows : Objets USER et GDI - Partie 2
Un autre bon article de Raymond Chen :
Il existe une solution qui pourrait fonctionner. J'ai affaire ici à une application de fournisseur qui se comporte mal et qui alloue des tonnes d'objets GDI et cette solution lui permet de fonctionner la plupart du temps...
Faites
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems" /v windows
Cherchez SharedSection=
qui doit être composé de 3 chiffres séparés par des virgules. Augmentez le nombre du milieu par 1024 à la fois et voyez si cela résout votre problème. Vous contrôlez la quantité de "desktop heap" avec cette variable, ce qui m'a permis par le passé de faire fonctionner une GDI qui se comportait mal.
Regardez KB184802 pour un peu plus d'informations. Recherchez SharedSection pour trouver la partie pertinente de la page.
Je suis en mesure d'augmenter mes objets GDI de 10000 à 15000 en modifiant UNIQUEMENT le GDIProcessHandleQuota, mais cela nécessite un redémarrage pour prendre effet. Je n'ai pas eu à modifier les valeurs de SharedSection, seul le redémarrage a été nécessaire.
Bien que 10000 semble un grand nombre, mon application a une grande interface utilisateur avec beaucoup de boutons, brosses, images, icônes, etc. Une fois que l'application démarre, le nombre d'objets n'augmente que si l'utilisateur fait quelque chose qui mérite une augmentation. Aucun objet GDI ne fuit de l'application. Pour tester ma solution, j'ai ajouté une méthode "leak", afin de pouvoir observer dans le gestionnaire de tâches ce qui se passe lorsque le nombre d'objets GDI augmente au-delà de diverses limites.