Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ¿Problema de memoria? (https://www.clubdelphi.com/foros/showthread.php?t=14012)

ciscu 07-09-2004 13:07:39

¿Problema de memoria?
 
Hola qué tal? Gracias por felicitarme en el día de mi cumpleaños!!!

Veréis, tengo un problema bastante raro. Cuando corro mi aplicación con bases de datos Paradox y escrito en delphi 5 en un ordenador con Win98 funciona de maravilla, pero cuando estoy utilizando esta aplicación durante un cierto tiempo (más o menos un cuarto de hora) ésta "peta" y aparece un mensaje de error de Windows diciendo que se ha producido un error y el programa debe cerrarse, independientemente de lo que esté haciendo el programa.

Esto puede deberse a un problema de memoria? Este ordenador tiene 128 MB de RAM!!! No creo, no? O sino qué está pasando?

Agradecería una respuesta, ya que esta sería mi mejor regalo de cumpleaños jejejeje!!!

Gracias anticipadas.

burasu 07-09-2004 13:21:56

hola Ciscu, en primer lugar felicitarte :P, en segundo, te has dado cuenta que has duplicado el mensaje? creo que te toca reprimenda por parte de los moderadores jeje

Bueno voy al grano. Puede ser problema de memoria, pero no por que tengas poca, sino por que a lo mejor no estas cerrando correctamente una ventana y despues la vuelves a crear, o tal vez no estas liberando bien una variable.

Por que no detallas un poco más el proceso de tu aplicación?

Salu2

Neftali [Germán.Estévez] 07-09-2004 13:53:35

Cita:

Empezado por ciscu
...estoy utilizando esta aplicación durante un cierto tiempo (más o menos un cuarto de hora) ésta "peta" y aparece un mensaje de error de Windows diciendo que se ha producido un error y el programa debe cerrarse, independientemente de lo que esté haciendo el programa.

¿Podrías ser más explícito con el error? ¿Qué es un AccessViolation? ¿Un RunTime Error 216? ¿?¿?

Cita:

Empezado por ciscu
...Esto puede deberse a un problema de memoria? Este ordenador tiene 128 MB de RAM!!!

Entiendo que si fuera un problema de la memoria del ordenador te debería pasar con otros programas, si los errores sólo se producen en éste programa de Delphi tiene sentido que sea algo que hay mal en éste programa.

Revisa el código que tengas donde hayas colocado Free o los eventos OnClose que puedas haber programado como ya te han dicho.

ciscu 08-09-2004 09:55:13

Hola a todos!!!

Bueno, ante todo el ordenador es Celeron (sin procesador matemático) con Win98 SE; puede afectar esto en algo?

El problema que me aparece es el típico de Windows, es decir, "El programa ha efectuado una operación no válida y debe cerrarse".

Cuando ejecuto mi programa, en la memoria se carga el formulario principal con menús y 3 datamodules llenos de las tablas paradox (TTable) y consultas (TQuery). Entonces, cuando quiero, por ejemplo, facturar, voy a este menú y se carga en memoria este formulario, y cuando salgo lo libero mediante

Código:

Formx.Release
Los formularios los abro mediante
Código:

Formx.ShowModal
por tanto, la ocupación de memoria tiene que ser constante ya que no puedo cargar más de dos formularios a la vez.

Podéis seguir ayudándome?

Gracias de antemano

Lepe 08-09-2004 15:27:10

Revisa que creas y liberas correctamente las ventanas según este hilo

CHiCoLiTa 08-09-2004 15:37:12

yo particularmente los hago del siguiente modo

Código Delphi [-]
        Form1 := TForm1.Create(Self);
        try
           Form1.ShowModal;
        finally
           FreeAndNil(Form1);
        end;

El FreeAndNil si no recuerdo mal creo que se implemento a partir de la version 5 de Delphi, que es lo equivalente a quitar le puntero y hacer un Free

burasu 08-09-2004 16:05:50

Mi metodo es el siguiente:

Código:

        with TForm_Pantalla.Create(self) do begin
                if ShowModal = mrOk then begin
                        // Si realizo alguna operación despues de aceptar la otra
                        // pantalla añado el código aquí
                end
                else begin
                        // Lo mismo si cancelo.
                end;
                Free;
        end;

Con esta forma evito crear y cerrar y terminar perdiendome. Así siempre que abro la ventan se que terminaré cerrandola.

Lepe 09-09-2004 09:40:48

Cita:

Empezado por burasu

Código:

  try
        with TForm_Pantalla.Create(self) do begin
                if ShowModal = mrOk then begin
                        // Si realizo alguna operación despues de aceptar la otra
                        // pantalla añado el código aquí
                end
                else begin
                        // Lo mismo si cancelo.
                end;
  finally
                Free;
  end;
        end;


He añadido el try finally para hacer más seguro el bloque. Si hay algún tipo de excepción mientras se muestra la ventana, que libere la ventana.

Y supongo que la variable que crea Delphi en la unidad de la ventana
Código Delphi [-]
var Form_Pantalla: TForm_Pantalla;
la eliminarás, ya que no la usas, es un puntero, no ocupa mucho espacio en memoria mientras que no la instancies, pero si tienes muchas ventanas, se van sumando los 4 bytes de cada puntero.

El método de chicolita lo veo muy correcto.

Saludos

__cadetill 09-09-2004 10:02:50

Pues con permiso del personal, yo añadiré un try...except al código propuesto :D

Código Delphi [-]
resourcestring
  errCreatingForm = 'Error en la aplicación. Mensaje de error'#13#13'%s';

implementation

..............

Form1 := TForm1.Create(Self);
try
  try
    Form1.ShowModal;
  finally
    FreeAndNil(Form1);
  end;
except
  on E: Exception do
    Application.MessageBox(PChar(Format(errCreatingForm, [E.Message])), 'Atención', MB_OK);
end;

Es que me gusta ver el tipo de excepción lebantada en una pantallita controlada po mi, manias de uno, ya véis :rolleyes:

:D

burasu 09-09-2004 10:35:04

Si efectivamente Lepe, esta variable
Código:

var Form_Pantalla: TForm_Pantalla;
la elimino, ya que no la utilizo para nada.

Yo tambien utilizaba el metodo de chicolita, pero digamos que tuve una mala experiencia por problemas de memoria en un proyecto, y me asesoraron que ese metodo no era muy correcto ¿?¿? así que utilizo este otro y así siempre me aseguro que no dejo la Form alojada en memoria una vez cerrada.


La franja horaria es GMT +2. Ahora son las 23:27:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi