Delphi - Tome en cuenta tus concejos. No se q pasa ahora

 
Vista:

Tome en cuenta tus concejos. No se q pasa ahora

Publicado por Cernidita (11 intervenciones) el 09/03/2006 16:22:29
Muchas gracias por el concejo, y lo puse en practica, pero mira lo que pasa ahora. Para ser clara tengo dudas de como descargar el dll de memoria, por que en un principio cuando inicio mi aplicacion empieza con unos KB digamos 1002 kB en memoria y cuando hago uso de la dll se incrementa a unos 6890 k y de ahi no baja (prove ejecutando paso a paso mi aplicacion y vi como cambia el uso de memoria), eh probado varias intrucciones para reducir la memoria utilizada. Haber explico lo que hizo con detalles:

Eh creado una libreria con tres procedimientos uno para conectar un control TADODataSet a una base datos echa en visual foxpro, otro procedimiento para realizar la consulta y el tercero para que utilice las dos anteriores procedimientos. Ninguna me retorna ningun dato, pero si envio el control TADODataSet para hacer la operaciones. ejem:

// libreria dll
procedure ConectaDB(PathDB: string; CnnC: TADODataSet);
begin
with CnnC do begin
Active:=False;
ConnectionString:=strPathDBU;
end;
end;

procedure aRealizaQuery(sQueryU: String; ADOds: TADODataSet);
begin
with ADOds do CommandText:=sQueryU;
end;

procedure CnnQuery(dsU: TADODataSet; phtSisL, strQuery: String); stdcall; Export;
begin
aConectaDB(phtSisL + 'dBase\', dsU);
aRealizaQuery(strQuery, dsU);
end;

.....

y en mi programa principal pongo lo siguiente:

Type
TCnnQuery = procedure(dsU: TADODataSet; phtSisL, strQuery: String); stdcall;

var
......
hLib: THandle;
CnnQuery: TCnnQuery;
.....

// en el evento create del form principal, extraigo un dato de la BD.

procedure TfrmTipoC.FormCreate(Sender: TObject);
var
dsF: TADODataSet;
begin
pthSys:=ExtractFilePath(Application.ExeName);
hLib:=0;
hLib:=safeLoadLibrary('dbpros.dll');
CnnQuery:=GetProcAddress(hLib, 'CnnQuery');
dsF:=TADODataSet.Create(Nil);
CnnQuery(dsF, pthSys, 'Select cambio from tipcambiosc');
with dsF do
begin
Active:=True;
if Recordset.Eof <> True then
begin
Recordset.MoveLast;
edTipoC.Text:=FormatFloat('0.00', Recordset.Collect[0]);
end;
Active:=False; dsF.ConnectionString:=''; dsF.Free;
end;
dsF:=Nil;
CnnQuery:=nil;
FreeLibrary(hLib);
FreeAndNil(CnnQuery);
FreeAndNil(dsF);
end;

y bueno como se ve eh utilizado mas de una intrucciones para reducir la memoria utilizada, pero nada sigue igual. Y eso que espere unos minutos para ver talves baja de apoco pero nada se queda ahi. Y no se si estoy haciendo algo mal (Soy novata), o es algun problema de mi XP, o
talves necesita un parche mi Delphi( version 7 Enterprise).

Espero respuestass, por fa......
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Tome en cuenta tus concejos. No se q pasa ahora

Publicado por Emilio (175 intervenciones) el 09/03/2006 17:57:57
Cambia la llamada a SaveLoadLibrary por LoadLibrary, intercepta el mensage
DLL_PROCESS_DETACH en delphi 7 esta constante da error pero su valor es 1 asi que puedes sustituir la siguiente llamada por:

If Reason = 1 then /// Ahora la libraria se esta descargando has lo que desees como CnnC.Active:=False; o CnnC.Free si es un objeto creado por ti.

Es lo unico que se me ocurre con respecto a eso, aunque parece que el mayor problema es que la dll no se esta descargando. Ahh tambien librera el objeto dsF pues este tambien esta consumiendo memory.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Tome en cuenta tus concejos. No se q pasa ahora

Publicado por Cernidita (11 intervenciones) el 09/03/2006 18:46:50
Hola denuevo.... gracias por la sugerencia, pero te comento algo qe sucedio. Al realizar todas las tareas que te comente, al final si se descarga, pero el administrador de tareas de windows en realidad no muestra cuanta memoria esta utilizando mi aplicacion cuando tiene foco. Bueno me explico, lo que hice (por si acaso fue por pura casualidad), es minimizar la ventana de mi aplicacion y vi en el administrador de tareas que la memoria asignada a mi aplicacion era mucho menor, y cuando restaure la ventana.... ahi esta este adminisrtador de tareas de windows me mostro lamemoria real osea mas o menos 1235 KB, y no 6342 KB (antes de minimizar). Bueno es algo extraño, pero ya se soluciono, pero de forma extraña.

Gracias por todo.....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Tome en cuenta tus concejos. No se q pasa ahora

Publicado por jose julian (46 intervenciones) el 09/03/2006 22:44:24
entonces si lo que quieres es liberar la memoria inactiva prueba lo que viene en esta dir:

http://www.marteens.com/trick42.htm

espero te sirva

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

pero que pasa si ejecuto mi aplicacion en Win98

Publicado por Cernidita (11 intervenciones) el 09/03/2006 23:56:16
Muy interesante, gracias Jose Julian.... pero que pasa si ejecuto mi aplicacion en Win98, pasa algo distinto que en XP o 2000??
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:pero que pasa si ejecuto mi aplicacion en Win98

Publicado por Emilio (175 intervenciones) el 10/03/2006 13:54:33
Lo mas probable es que obtengas una Excepcion ya que la funcion que comenta Iam en ese manuscrito pertene a la quernel de windows, es decir solo las versiones de windows para 32 Bytes tienen definida esa funcion en su quernel.

Me alegra haberte ayudado!!. Byeeeee...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Muchas gracias

Publicado por cernidita (11 intervenciones) el 10/03/2006 15:37:31
Bueno muchas gracias....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Muchas gracias

Publicado por jose julian (46 intervenciones) el 10/03/2006 22:31:07
tienen razon por eso viene en el escrito la aclaracion:

"La mala noticia es que SetProcessWorkingSetSize no llegó a implementarse sobre Windows 9x/ME. No pasa nada si ejecutamos esa función, pero para no perder el tiempo, el procedimiento LiberarMemoria comprueba el valor de la variable global Win32Platform."

Saludos y viva el Rock YEAH!!!! :P
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Tome en cuenta tus concejos. No se q pasa ahora

Publicado por Incognito (54 intervenciones) el 11/03/2006 14:26:07
Saludos! Cernidita,

Yo supongo que tu aplicacion tiene menus principales, pues, en el menu principal convoca cada modulo o unidad de la sigte. manera:

...
Application.CreateForm(<TEl Form o Unidad/Modulo>, <El Form o Unidad/Modulo>);
<El Form o Unidad/Modulo>.Showmodal;
<El Form o Unidad/Modulo>.Release;

Claro, hay otras formas y tecnicas para hacer esto...y Delphi en este caso lo que hace es cargar la unidad o modulo y luego descargarlo de la memoria; en cuanto al manejo de datos es posible que tu aplicacion este usando muchos Tables y estos tienen la particularidad de cargar todos los registros de la tabla una vez se abren, esto contribuye al consumo de memoria, por lo tanto, otra tecnica del Delphi es utilizar Querys que se comporten como Tables con la particularidad de que te carga Un Solo Registro a medida que se va requiriendo... sobre esto puedes mandarme un e-mail o mantener contacto conmigo a la direccion [email protected], estoy desinteresadamente para ayudarte a tus ordenes...

Ing. Incognito -La Solucion Efectiva del Futuro -Inmediato-
R.D.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar