2012-03-15 103 views
13

Tiene una aplicación con una fuga de GDI que finalmente llegará a los 10 000 objetos GDI asignados y se bloqueará. Traté de aumentar el GDIProcessHandleQuota a 20,000, pero el programa aún se bloqueó cuando alcanzó los 10,000 objetos. Actualmente estamos trabajando para reparar esta fuga, pero por curiosidad, ¿hay alguna forma de aumentar el límite de GDI para un único proceso? ¿O es 10k el límite estricto de una aplicación individual?¿Cuál es el límite superior en objetos GDI para un proceso en Windows 7?

+0

Incrementando 'GDIProcessHandleQuota' a' 20,000' me funcionó. Tuve que reiniciar el sistema después de que el registro cambia. Se actualizó la clave del Registro en 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ GDIProcessHandleQuota' – Agalo

Respuesta

6

No es una solución que podría trabajo . Yo trato con aplicación de un vendedor con un comportamiento incorrecto aquí que asigna toneladas de objetos GDI y esta solución le permite trabajar la mayor parte del tiempo ...

hacer

reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems" /v windows

Busque SharedSection= que debe ser 3 números separado por comas. Aumenta el número del medio en 1024 a la vez y mira si eso resuelve tu problema. Usted está controlando la cantidad de "montón de escritorio" con esta variable que en el pasado me permitió ejecutar un GDI que funciona mal.

Mire KB184802 para obtener un poco más de información. Busque SharedSection para encontrar la parte relevante de la página.

+0

¡Bingo! Subí al montón de escritorio y ahora puedo ir más allá de los 10.000 objetos de GDI. Nuestro desarrollador principal ya creó un parche, pero ahora mi curiosidad está resuelta. Gracias – Micky

+0

¡Hola! mi SharedSection está configurada en 1024,20480,768 pero mi python.exe aún se cuelga. He leído que no es seguro aumentar el montón de escritorio en 20480? ¿cuál es tu opinión? – Aleksandar

+0

@ Aleksandr: Si recuerdo correctamente, el total de todos esos números no puede exceder los 48 MB. Esos números reservan memoria en kilobytes. También existen otros límites basados ​​en la cantidad y los servicios que tiene en ejecución. Lee los primeros 3 enlaces en la respuesta de Derek Parks para obtener buenos antecedentes. Además, asegúrese de no crear más de 10.000 objetos GDI. – JimR

15

10K es un límite estricto.

Los objetos GDI representan recursos de la interfaz gráfica del dispositivo como fuentes, mapas de bits, pinceles, lápices y contextos de dispositivo (superficies de dibujo). Como lo hace para los objetos de usuario, los límites de la ventana del gestor de procesos, como máximo, 10.000 objetos GDI [...]

Mark Russinovich tiene una serie de artículos que van en profundidad sobre los diversos límites de Windows. Usted puede encontrar estos dos útiles:

Otro buen artículo de Raymond Chen:

+1

Gracias por la información. Había hojeado los artículos de Pushing the Limits of Windows antes de publicar aquí y noté que Mark R.no le muestra cómo modificar el registro para expandir el límite predeterminado de GDI más allá de 10k, así que pensé que podría haber sido algo que pasó por alto. Todavía estoy confundido por qué este número puede ser tan alto como 65535 si no tiene un efecto notable en mi máquina. Puedo consumir mucho más allá de un total de 10k objetos para todos mis procesos sin retraso en Windows, no es hasta que una aplicación alcanza los 10k cuando recibo un bloqueo. – Micky

+0

'10K es un límite difícil. Esto parece no ser cierto. ¿Puede agregar detalles sobre la relación de la limitación a la que se refiere al howto en [respuesta de JimR] (http://stackoverflow.com/a/9723784/2932052) – Wolf

+0

? Existe una clave de Registro llamada GDIProcessHandleQuota. No parece ser tan difícil cambiar ese límite. Creo que mezcló los identificadores de GDI y los identificadores de Usuario. –

0

Puedo aumentar mis objetos GDI de 10000 a 15000 cambiando SOLAMENTE el GDIProcessHandleQuota, pero esto requiere que el reinicio tenga efecto. No tuve que cambiar mis valores de SharedSection, solo se requería reiniciar.

Mientras que 10000 parece un número grande, mi aplicación tiene una interfaz de usuario grande con muchos botones, pinceles, imágenes, iconos, etc. Una vez que la aplicación se inicia, el número de objetos solo aumenta si el usuario hace algo que merece un aumento. Ningún objeto GDI se está escapando de la aplicación. Para probar mi solución agregué un método de "fuga", para poder ver en el administrador de tareas lo que sucedió a medida que el número de objetos GDI aumentaba más allá de varios límites.

Cuestiones relacionadas