Foros del Web » Programación para mayores de 30 ;) » Programación General »

Cuando Cierro Un Mdi Queda En Memoria...

Estas en el tema de Cuando Cierro Un Mdi Queda En Memoria... en el foro de Programación General en Foros del Web. EL PROBLEMA QUE TENGO ES QUE HICE UN PROGRAMA EN VISUAL BASIC EN EL CUAL TENGO UNAS DATAGRID ENLASASDAS CON UNAS BASES DE DATOS PERO ...
  #1 (permalink)  
Antiguo 15/01/2002, 10:06
 
Fecha de Ingreso: enero-2002
Mensajes: 2
Antigüedad: 22 años, 10 meses
Puntos: 0
Cuando Cierro Un Mdi Queda En Memoria...

EL PROBLEMA QUE TENGO ES QUE HICE UN PROGRAMA EN VISUAL BASIC EN EL CUAL TENGO UNAS DATAGRID ENLASASDAS CON UNAS BASES DE DATOS PERO CUANDO CIERRO EL MDI DESDE LA CRUZ DE LA BARRA DE TITULO ESTE QUEDA CARGADO EN MEMORIA Y LO MAS LOCO ES QUE SI LO CIERRO DESDE UN MENU QUE HICE SALE LO MAS BIEN SI ALGUIEN PUEDE AYUDARME SE LO AGRADECERIA MUCHO.

CHAOO GRACIAS...
  #2 (permalink)  
Antiguo 16/01/2002, 16:07
 
Fecha de Ingreso: noviembre-2001
Mensajes: 415
Antigüedad: 23 años
Puntos: 0
Re: Cuando Cierro Un Mdi Queda En Memoria...

si cerras desde la cruz un mdi te hace form.hide
si pones form.unload te lo saca de memoria.

modifica el evento del form del exit (no me acuerdo como se llama) para que haga un unload explicito
  #3 (permalink)  
Antiguo 17/01/2002, 09:31
 
Fecha de Ingreso: enero-2002
Mensajes: 2
Antigüedad: 22 años, 10 meses
Puntos: 0
Re: Cuando Cierro Un Mdi Queda En Memoria...

Pero en que parte se hace eso donde se pone el codigo form.unload porque no hay una propiedad para la cruz del MDI ?
  #4 (permalink)  
Antiguo 16/02/2002, 01:25
 
Fecha de Ingreso: febrero-2002
Ubicación: Oaxaca, México
Mensajes: 18
Antigüedad: 22 años, 9 meses
Puntos: 0
Re: Cuando Cierro Un Mdi Queda En Memoria...

Mira te recomiendo que te asegures de cerrar todos tus formularios.
¿Como te aseguras de ello? Pues crea una funcion que cierre todos los formularios activos (menos el mdi) y la llamas en el evento Unload del MDI.
Y de ser así puedes asegurarte de que se termine tu aplicación con lo siguiente.

Private Sub MDIForm_Unload(Cancel As Integer)
End
Set MDIForm1 = Nothing
End Sub

A mi esto me funciono en una ocasion que me sucedio tu problema.
  #5 (permalink)  
Antiguo 17/02/2002, 01:01
Nch
 
Fecha de Ingreso: febrero-2002
Mensajes: 73
Antigüedad: 22 años, 9 meses
Puntos: 0
Re: Cuando Cierro Un Mdi Queda En Memoria...

- Creo que no debes forzar la salida de tu programa, debido a que presenta sintomas de un error de cursores en memoria (no los estas cerrando correctamente) o formularios cargados pero no visualizados. Date un tiempo para leer tu codigo y eliminar el error.

- Luego, usa un solo punto de salida, es decir, lo que programaste en el procedimiento TuMenuSalir_Click(), pasalo al proc MDIform_unload(), y luego en TuMenuSalir_Click() solo escribe la linea "unload me", de esa forma usar salir de tu menu o presionando la X, sera lo mismo.

- Si quieres un proc para forzar la descarga:

For Cont = Forms.Count - 1 To 0 Step -1
Unload Forms(Cont)
Next
  #6 (permalink)  
Antiguo 17/02/2002, 02:42
 
Fecha de Ingreso: febrero-2001
Mensajes: 1.374
Antigüedad: 23 años, 9 meses
Puntos: 11
Re: Cuando Cierro Un Mdi Queda En Memoria...

Amigos, UNLOAD no lo quita de la memoria. Fijate lo que escribió Dans que es la forma correcta de hacerlo:

Set MDIForm1 = Nothing

<BLOCKQUOTE><font size=1 face=arial>Citando:<hr height=1 noshade>Private Sub MDIForm_Unload(Cancel As Integer)
End
Set MDIForm1 = Nothing
End Sub [/QUOTE]

Saludos
Tk
  #7 (permalink)  
Antiguo 18/02/2002, 03:36
Nch
 
Fecha de Ingreso: febrero-2002
Mensajes: 73
Antigüedad: 22 años, 9 meses
Puntos: 0
Re: Cuando Cierro Un Mdi Queda En Memoria...

Tuczone,
El forzar al MDI a desaparecer de memoria no quiere decir que los formularios hijo hayan finalizado correctamente.

Los principales problemas de lentitud de las PCs clientes se debe justamente al mal uso de la memoria, sobre todo en windows, ya que el administrador de memoria no elimina correctamente el proceso (a diferencia de Unix o Linux).

La instruccion que fuerza a eliminar de memoria el MDI es &quot;END&quot; y no la instruccion &quot;Set MDIform1 = nothing&quot;. Revisen el MSDN sobre estas instrucciones

Haz la siguiente prueba y te convenceras:

Private Sub MDIForm_Unload(Cancel As Integer)
Set MDIForm1 = Nothing
End Sub

'Un menu en el MDI
Private Sub MenuPrb_Click()
'Un textbox en otro formulario
MsgBox Form1.Text1.text
End Sub


La mejor practica en programacion, es leer tu codigo detenidamente antes de compilarlo (la meta es cero errores antes de compilarlo)

Saludos

  #8 (permalink)  
Antiguo 19/02/2002, 01:27
 
Fecha de Ingreso: febrero-2001
Mensajes: 1.374
Antigüedad: 23 años, 9 meses
Puntos: 11
Re: Cuando Cierro Un Mdi Queda En Memoria...

Citando Manual de Visual Basic de Microsoft Press:

Cuando descarga un formulario mediante el método Unload, sólo se libera UNA PARTE de la memoria ocupada por el formulario. Para liberar TODA la memoria, invalide la referencia al formulario mediante la palabra clave NOTHING:

Set Form = Nothing

* Extraido de Microsoft Visual Basic 6.0 Manual del Programador (Microsoft Press)

Es lo primero que te esnseñan cuando comenzas a programar en Visual Basic, a liberar la memoria. Por eso me pareció extraño que todos hagan referencia al método Unlaod. Esto se aplica cuando se trabaja con todo, controles, variables, etc.

Por ejemplo, para liberar la memoria utilizada por los gráficos de un cuadro de imagen o de un control Image, se establece la propiedad Nothing para dejarla vacía:

Set Picture1.Picture = Nothing

Po otro lado, cuando trabajamos con variables, se puede tambien aplicar otro método, por ejemplo:

varTuk = &quot;&quot;

Esto, úniamente en el caso de variables, cumple la misma función y libera el espacio ocupado (algo muy importante si estamos desarrollando aplicaciones de gran magnitud).

Espero que esta info les sea útil, es algo básico, pero siempre es bueno recordarlo.

Saludos
Tk

  #9 (permalink)  
Antiguo 19/02/2002, 01:43
 
Fecha de Ingreso: febrero-2001
Mensajes: 1.374
Antigüedad: 23 años, 9 meses
Puntos: 11
Re: Cuando Cierro Un Mdi Queda En Memoria...

<BLOCKQUOTE><font size=1 face=arial>Citando:<hr height=1 noshade>Nch
El forzar al MDI a desaparecer de memoria no quiere decir que los formularios hijo hayan finalizado correctamente. [/QUOTE]

Hola Nch, fijate que cuando descargas un formulario hijo tenes que utilizar el método Unload, de lo contrario el método End finaliza la aplicación. No importa que método uses, simpre, pero siempre tenes que liberar la memoria.

Para optimizar la velocidad con la que se ejecuta una aplicación, existen varias reglas que se deben respetar, como por ejemplo, no abusar de la propiedades de los controles:

Text1.text &lt;- Ocupa más memoria
Text1 &lt;- La forma correcta de referirse a un control

Saludos
Tk
  #10 (permalink)  
Antiguo 20/02/2002, 00:44
Nch
 
Fecha de Ingreso: febrero-2002
Mensajes: 73
Antigüedad: 22 años, 9 meses
Puntos: 0
Re: Cuando Cierro Un Mdi Queda En Memoria...

Del MSDN:

&quot;Ciclo de vida de los formularios de Visual Basic

Puesto que son visibles para el usuario, los formularios y los controles tienen un ciclo de vida diferente del resto de los objetos. Por ejemplo, un formulario no se cierra sólo por liberar todas las referencias al mismo. Visual Basic mantiene una colección global con todos los formularios de un proyecto y sólo quita un formulario de dicha colección cuando lo descarga.

De forma parecida, Visual Basic mantiene una colección con todos los controles de cada formulario. Puede cargar y descargar controles desde las matrices de controles, pero no basta con liberar todas las referencias a un control para destruirlo...&quot;
.
.
.
&quot;La única manera de liberar toda la memoria y los recursos es descargar el formulario y establecer todas sus referencias a Nothing. &quot;
.
.
.
&quot;Para liberar memoria del formulario, tiene que establecer esta variable a Nothing. Por ejemplo:

Set Form1 = Nothing &quot;

OJO: Se refiere a liberar la memoria del formulario al que se hace referencia y no la ocupada por los demas formularios.

.
.
.
&quot;Nota Ejecutar la instrucción End descarga todos los formularios y establece todas las variables de objeto del programa a Nothing. Sin embargo, es una manera muy brusca de terminar los programas. Ninguno de los formularios recibirá los eventos QueryUnload, Unload o Terminate, y los objetos que creó no recibirán los eventos Terminate&quot;
.
.
.

Ubicacion:
Conceptos de Visual Basic

  #11 (permalink)  
Antiguo 20/02/2002, 01:31
Nch
 
Fecha de Ingreso: febrero-2002
Mensajes: 73
Antigüedad: 22 años, 9 meses
Puntos: 0
Re: Cuando Cierro Un Mdi Queda En Memoria...

<BLOCKQUOTE><font size=1 face=arial>Citando:<hr height=1 noshade>La instruccion que fuerza a eliminar de memoria el MDI es &quot;END&quot; y no la instruccion &quot;Set MDIform1 = nothing&quot;. Revisen el MSDN sobre estas instrucciones [/QUOTE]
Introduje un error en la idea. Cuando mencione MDI, me referia al Proyecto (con todos sus formularios), mil disculpas.
------------------------------

Nadie discutira que el unload no quita de memoria el formulario, pero es alli donde se controla si el formulario debe o no cerrarse y por tanto es recomendable ejecutar &quot;unload form1&quot;.

Lo que trato de decir a &quot;jretamal&quot; es que si sus formularios no fueron descargados es porque tiene algun problema en el codigo de sus formularios hijos y por lo tanto forzar a finalizar &quot;la aplicacion&quot; (lo escribi MDI) con una instruccion END no necesariamente es lo correcto (p.ej podria tener archivos temporales abiertos que nunca serian cerrados y eliminados; en un proyecto grande podria ser grave)

Por otro lado la instruccion
Set Form1=Nothing por si sola, quita de memoria &quot;solo el formulario&quot; y no los formularios hijos abiertos. El codigo ejemplo que escribi anteriormente no trata de mostrarles la forma correcta de referenciar a un TextBox, sino que aun usando Set form1=Nothing, la aplicacion seguira en memoria al salir debido a que al presionar en &quot;MenuPrb&quot; se hizo referencia a un formulario hijo y luego no fue quitado de memoria.

Saludos
Nch
  #12 (permalink)  
Antiguo 20/02/2002, 01:32
Nch
 
Fecha de Ingreso: febrero-2002
Mensajes: 73
Antigüedad: 22 años, 9 meses
Puntos: 0
Re: Cuando Cierro Un Mdi Queda En Memoria...


<BLOCKQUOTE><font size=1 face=arial>Citando:<hr height=1 noshade> Nch
El forzar al MDI a desaparecer de memoria no quiere decir que los formularios hijo hayan finalizado correctamente [/QUOTE]

&quot;Finalizar correctamente&quot;, desde mi punto de vista no quiere decir &quot;eliminar de memoria&quot;, sino concluir correctamente las actividades que estuvo realizando (archivos temporales, puertos abiertos). Por ejemplo, si &quot;jretamal&quot; esta realizando una aplicacion para un modem y uno de sus formularios tiene abierto el puerto (COM) y desde el MDI se produce la instruccion END, entonces la aplicacion terminara pero el Puerto quedara abierto y otra aplicacion no podra usarlo.

Saludos
Nch
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:39.