2008-10-21 66 views
51

Estamos viendo este error en una aplicación de Winform. ¿Alguien puede ayudarme sobre por qué verá este error y, lo que es más importante, cómo solucionarlo o evitar que suceda?Problema de Winforms - Error al crear el identificador de ventana

 
System.ComponentModel.Win32Exception: Error creating window handle. 
    at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp) 
    at System.Windows.Forms.Control.CreateHandle() 
    at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) 
    at System.Windows.Forms.Control.CreateControl() 
    at System.Windows.Forms.Control.OnVisibleChanged(EventArgs e) 
    at System.Windows.Forms.ButtonBase.OnVisibleChanged(EventArgs e) 

Respuesta

42

¿Ha ejecutado el Explorador de procesos o el Administrador de tareas de Windows para ver los Objetos, Manijas, Subprocesos y objetos USER de GDI? De lo contrario, seleccione las columnas que desea ver (Administrador de tareas, seleccione Vista-> Seleccionar columnas ... Luego ejecute su aplicación y observe esas columnas para esa aplicación y vea si una de ellas está creciendo realmente grande.

puede ser que usted tiene componentes de interfaz de usuario que usted piensa se limpian pero no se han eliminado.

Here's a link sobre este que podría ser útil.

buena suerte!

+1

Me encontré con este problema y encontré que mi aplicación reportó 9600 objetos de usuario y 1800 objetos de GDI. Mi problema es que no estoy haciendo nada mal, solo estoy agregando muchos elementos a un FlowLayoutPanel. Supongo que tendré que 'poner en la página' los datos mostrados ... –

1

Creo que normalmente está relacionado con la computadora que se queda sin memoria por lo que no puede crear más controladores de ventanas. Normalmente Windows también comienza a mostrar un comportamiento extraño en este punto.

+0

cualquier cosa para enfocarse. . . – leora

-1

El cabo de sugerencia de memoria no parece una mala ventaja.

¿Qué está haciendo su programa que obtiene este error?

¿Está creando una gran cantidad de ventanas o controles? ¿Los crea programáticamente en lugar de en tiempo de diseño? Si es así, ¿lo haces en un bucle? Es ese bucle infinito? ¿Está consumiendo cantidades asombrosas de memoria de alguna otra manera?

¿Qué sucede cuando mira la memoria utilizada por su aplicación en el administrador de tareas? ¿Se dispara a la luna? O mejor aún, como se sugirió anteriormente, use el monitor de proceso para profundizar en los detalles.

21

El límite del identificador de ventanas para su aplicación es de 10,000 identificadores. Recibirá el error porque su programa está creando demasiados controladores. Necesitarás encontrar la pérdida de memoria. Como otros usuarios han sugerido, use un Profiler de memoria. Yo uso el .Net Memory Profiler también. Además, asegúrese de llamar al método de eliminación de los controles si los está eliminando de un formulario antes de, el formulario se cierra (de lo contrario, los controles no se eliminarán). También deberá asegurarse de que no haya eventos registrados con el control. Yo mismo tengo el mismo problema, y ​​a pesar de lo que ya sé, todavía tengo algunas pérdidas de memoria que me siguen eludiendo ...

0

Recibí el mismo error en mi aplicación. Estoy cargando muchos controles en una sola página. En el botón, haga clic en evento, estoy liberando los controles. Limpiar los controles no libera los controles de la memoria. Así que disponga los controles de la memoria. Acabo de comentar el método controls.clear() e incluyo algunas líneas de código para eliminar los controles. Algo como esto

por cada CTL como control en ControlCollection

CTL.dispose()

Siguiente

5

Este problema casi siempre está relacionada con el recuento de objetos GDI usuario recuento de objetos o Handle contar y por lo general no debido a una condición de falta de memoria en su máquina.

Cuando estoy rastreando uno de estos errores, abro ProcessExplorer y miro estas columnas: Handles, Threads, Objetos GDI, Objetos de USER, Bytes privados, Tamaño virtual y Conjunto de trabajo.

(En mi experiencia, el problema es por lo general una fuga de objeto debido a un controlador de eventos que sostiene el objeto y evitando que pueda ser dispuesto.)

2

Bueno, en mi caso fue definitivamente los objetos de usuario que estaban fuera de control. Busqué en el Administrador de tareas de Windows y, efectivamente, el recuento de objetos del USUARIO estaba en 10'000 exactamente.

Estoy embebiendo dinámicamente propiedades y hojas de lista en Páginas de pestaña estableciendo la propiedad principal de la propiedad o el panel de contenedor de la hoja de lista con la de la página de pestaña. Estoy reciclando o recreando de forma condicional la propiedad y los formularios de hoja de lista dependiendo del tipo de colección que se enumera o el tipo de clase del objeto que se inspecciona.

NB: En Delphi, todos los controles tenían una propiedad Owner y Parent. Incluso si se cambiara la propiedad Parent de un control, su propietario lo eliminaría cuando se destruyera el control propietario.

En C# parece que si un control p. Ej. un Panel es reasignado programáticamente desde, digamos, un Formulario a una Página de Ficha cambiando la propiedad Panel.Parent, llamando a Dispose() en el Formulario no eliminará el Panel, ni llamará a Controls.Clear() en la Página de Tabulación. Incluso una llamada directa Panel.Dispose() en realidad no lo eliminará, a menos que su Parent se configure manualmente como nulo de antemano.

1

que añaden un cheque que hace que funcione ...

if (_form.Handle.ToInt32() > 0) 
{ 
    _form.Invoke(method, args); 
} 

siempre es cierto, pero la forma de lanza un error sin eso. BTW, mi mango es de alrededor de 4,9 millones

+0

Tenga en cuenta que la implementación de la propiedad Handle comprueba si se crea el identificador, y si no, lo crea. Buscando en el código fuente de .NET: 'public IntPtr Handle {get {... if (! This.IsHandleCreated) {this.CreateHandle(); } ...}} 'La propiedad' IsHandleCreated' le devolverá verdadero/falso sin crear el identificador. –

Cuestiones relacionadas