FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Gestion de la memoria
Hola a todos, tengo una pregunta tecnica que me gustaria resolver para quedarme tranquilo. Estoy desarrollando una aplicacion en delphi para android y estoy utilizando el patrón arquitectónico "modelo-vista-controlador", aparentemente todo funciona, pero si he notado que cuando la app trabaja mucho la memoria ram del dispostivo se llena (aunque no considerablemente), lo que implica que no se esta liberando bien la memoria y particularmente tengo una duda:
tengo una clase modelo generica que crea un componente tsqlquery en tiempo de ejecucion, el controlador llama al modelo y este devuelve un tsqlquery cargado con la consulta pertinente, a continuacion el controlador delvuelve el tsqlquery al formulario(vista). Os pongo un ejemplo generico: <<vista>> type TForm2 = class(TForm) procedure FormShow(Sender: TObject); private sql:tsqlquery; public { Public declarations } end; implementation procedure TForm1.FormShow(Sender: TObject); var cliente:tcliente; begin cliente:= Tcliente.create; //esta funccion del controlador cliente carga el tsqlquery con la lista de clientes. cliente.listarcliente(sql); // una vez cargado la variable sql se realizan mas operaciones; end; < controlador cliente, funcion listar cliente > procedure TCliente.ListarClientes (var SQL: TSQLQUERY); var modelocliente: TModeloCliente; begin // cuando se ejecuta el contructor del modelo cliente, éste crea un tsqlquery y lo inicializa, el destrucctor de la clase libera dicho tsqlquery. modelocliente:=TModeloCliente.Create; // esta funcion devuelve el tsqlquery creado en el contructor y cargado con la consulta. SQL:= modeloCliente.ListarClientes(); end; Mi pregunta es, ¿ESTA ASIGNACION SE COPIA POR VALOR O POR REFERENCIA? SQL:= modeloCliente.ListarClientes(); Lo que si puedo decir es que una vez finalizada la funcion del controlador, el destructor del modelo cliente actua y libera el tsqlquery. Aun así la variable sql del formulario esta correctamente cargada y no esta liberada, lo que me hace pensar que es por copia o que no se esta liberado bien. El problema de la ram puede venir por ahí. cada vez que se crea el modelo se crea un nuevo tsqlquery, ¿se habra liberado el espacio reservado para el anterior? |
#2
|
||||
|
||||
Cita:
Al liberar el Query, la variable SQL no se apunta a nil, a no ser que lo hagas manualmente. Si intentas hacer algo con va variable SQL seguramente obtendrás un access Violation, pues esa memoria a la que apunta ya ha sido liberada.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#3
|
||||
|
||||
Esta medio raro tu modelo de datos.
Lo que se ve a simple vista es que tenes una variable llamada "cliente" de tipo TCliente, es decir la variable "cliente" deberia representar solo UNO de los clientes de tu negocio, este deberia conocer su nombre, apellido, mail, y tener metodos como por ej. DeudaPendiente, UltimaCompraRealizada, ProductoMasComprado, etc. Recordar que es UNA instancia de TCLIENTE, siendo TCliente una estructura con metodos y atributos que tienen todos los clientes. Ahora para modelar comportamiento de varios clientes yo lo que hago es tener otra clase encargada de eso, por ej una TClientMgr o TClientHandler. Esta clase es la que se encarga de "pedirle" a la capa de acceso datos que me traiga la o las instancias de TCliente que necesito. Esta clase por ejmplo conoce metodos como ObtenerCliente(Id: integer): TCliente, ObtenerClientes(<parametros de busqueda>): TList<TCliente> y demases Es solo una sugerencia para tu codigo, tu pregunta ya la respondio Neftali |
#4
|
|||
|
|||
Cita:
Si realmente es una asigancion de punteros, el ultimo showmessage deberia lanzarme un acess violation puesto que se ha liberado el espacio al que apunta, y para mi sorpresa me muestra el showmessage. ¿Porque?,¿Tal vez sea por como se gestiona la memoria en android?. De todas maneras así ha quedado el código final, que creo que es lo que te entendí. (Se han añadido las variables reales de la funcion): <Controlador cliente, Procedimiento ListarClientes >
< os pongo el codigo del constructor y del destructor, por sí aclara mas la situación >
No se si me habre explicado bien puesto que el tema no es facil de explicar, pero si necesitas de alguna función mas para su compresión por favor solicitamelo. Un saludo y muchisimas gracias Última edición por Neftali [Germán.Estévez] fecha: 20-01-2015 a las 18:11:59. Razón: Poner tags al código |
#5
|
|||
|
|||
Cita:
Lo tendré en cuenta para futuros proyectos, gracias |
#6
|
||||
|
||||
Por favor, utiliza TAG's cuando escribas código Delphi.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#7
|
||||
|
||||
Es posible que sea algo diferente en la gestión o liberación de memoria, porque si creas una estructura similar en Windows, verás que al realizar el último ShowMessage obtienes un "Access Violation"
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#8
|
|||
|
|||
Gracias por su atención de momento se va a quedar así, seguire investigando de como puedo bajar la ram. gracias por todo
|
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Gestion de proyectos | Angel Vicente | Varios | 0 | 15-03-2010 14:37:36 |
gestion de memoria delphi | joni | Varios | 1 | 17-03-2005 21:03:36 |
ISC ERROR CODE:335544344 I/O error for file "c:\gestion\gestion.gdb" | eliasterrero | Firebird e Interbase | 2 | 28-06-2004 12:20:25 |
Gestion de Memoria | craven | Varios | 1 | 04-07-2003 04:31:16 |
Gestión de Memoria | ogorut | Varios | 2 | 09-05-2003 17:26:11 |
|