26 votes

Quelle est la limite supérieure des objets GDI pour un processus sous Windows 7 ?

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 ?

17voto

Derek Park Points 25025

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 :

Un autre bon article de Raymond Chen :

13voto

JimR Points 4816

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.

1voto

wolf Points 11

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X