Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Aplicacion Leeeeenta ... (https://www.clubdelphi.com/foros/showthread.php?t=53170)

Kenobi 12-02-2008 22:39:31

Aplicacion Leeeeenta ...
 
desde hace ya algun tiempo tengo una aplicacion en Delphi que conecta a una B.D MsSql2000 pues bien todo funcionaba bien hasta hace poco en los que los tiempos de carga son infinitamente largos (tiene un ventana Splash) ahora bien que pasara... esa es mi pregunta
  • que puedo hacer para mejorar el rendimiento general de mi aplicacion
  • que puedo revisar ....(el codigo no porque funcionaba bien antes)...
  • de que depende delphi en cuanto a servicios de windons (ODBC etc)
  • como monitoreo la red que pruebas puedo hacer
  • Y si la trasformo a 3 capas mejoraria ..?(actualmente es a Dos capas)

Gracias ....

Asi mismo pregunto si existe alguna herramienta que permita monitorear la respuesta de un servidor de datos a fin de establecer que esta fallando .....

ixMike 12-02-2008 23:45:59

No sabemos qué puedes hacer si no sabemos lo que haces. Dices que es lenta al cargar, ¿qué cosas realiza la apliación al cargarse? ¿Qué objetos/componentes utilizas? ¿Podrías ponernos algo de código? ...


Salu2.

Chris 12-02-2008 23:58:30

Piensa en estos puntos para determinar tu problema:
Haces una conección directa al servidor MS Server (no por medio de DBE o ODBC).
  1. Pasa en un sólo cliente o en todos?
  2. Haz monitoreado el uso de la red (puede estar saturada)
  3. Que cantidad de procesamiento de datos haces al momento de iniciar tu aplicación cliente ¿Será demaciado para que se vuelva lenta?
  4. se me acabaron las ideas por el momento.
Si no haces una conexión directa, pueda ser que el problema sea el DBE o bien el mismo sistema operativo.

Si ocurre en todos los clientes (inclusive con S.O. recién instalados) puede ser que el problema esté del lado del servidor.

A forma de relato, todavía estoy desarrollando una aplicación para trabajar directamente con servidor firebird, pero he notado que cuando la memoría RAM libre del servidor baja a menos de 200, mis aplicaciones clientes se vuelven leeentas, inclusive sólo con un cliente conectado. Revisa bien, para determinar en donde se encuentra el problema, luego de encontrarlo sería momento de buscar una solución.

Saludos.

Kenobi 13-02-2008 02:14:57

Respuesta
 
Hola amigos gracias por sus respuestas, les respondo a continuacion ....


Hago conexion por medio de Ole por medio de los componentes de corelab ojo es lo mismo que con ado,

yo creo que el problema no esta en la aplicacion porque como dije, ella funcionaba bien pero la describo de manera somera a continuacion...

es una aplicacion normalita Cliente servidor a dos capas con + o - 15 tables y otro tanto en consultas actualizables(son necesarias) en el arranque pues accede a estas y luego carga en memoria algo asi como 10 forms, en su mayoria se encarga de hacer consultas a la BD y generar reportes en crystal, como dije una aplicacion normalita

yo creo que el problema esta en el servidor y o en la red, el problema es que temo que este caido un servicio o algo ,

por eso pregunto de que depende a nivel de servicios una aplicacion asi, Odbc lo uso solo para algunos reportes en crystal que se ejecutan en la aplicacion que mas debo revisar ....

Gracias por sus respuestas

eric565 13-02-2008 04:52:54

Casi lo mismo
 
con D7 y MSSQL Server 7
tuve el mismo problema. probé todo lo que se me venga a la cabeza y luego....
nada, nada se ha solucionado, aunque un buen dia se me ocurrió terminar un proceso (o sea, uno de los procesos...) llamado svchost y el problema se fue, así como mis temas de xp y demás artilugios gráficos que sólo sirven para quemar con mayor velocidad las pestañas, ah! otra cosa, este pc (que lo utilizo como server de internet en mi lan) quedaba con conexión pero las demás se perdían, los detalles gráficos volvían al cabo de tres minutos, pero la conexión, no.
No te digo que sea una solución, mucho menos algo saludable, pero me saca de apuros cuando el cliente está al lado mío, haciendo comentarios sobre la velocidad con la que trabaja el programa.
Si quieres más detalles, te los contaré....

Kenobi 14-02-2008 02:24:38

Otra caracteristica de la Falla
 
Hola amigos

pues otra cosa la lentitud de la aplicacion es solo en la carga despues la cosa mejora notablemente yo diria que esta a un 90 % de su velocidad normal ....
esto con que tendra que ver ...

Gracias por sus respuestas ....

Neftali [Germán.Estévez] 14-02-2008 10:29:19

Cita:

Empezado por Kenobi (Mensaje 265722)
pues otra cosa la lentitud de la aplicacion es solo en la carga despues la cosa mejora notablemente yo diria que esta a un 90 % de su velocidad normal ....

Deberías explicar con detalle qué cosas estás haciendo en esa carga y tal vez colocar algo de código, de otra forma es difícil adivinar qué pasa...

Kenobi 14-02-2008 12:15:48

Pues como ya dije....
 
Hola neftali ....

durante la carga de la aplicacion se crean los distintos formularios asi como el modulo de datos (este va de primero) y dentro de el hay pues tablas y consultas (como 15 o menos de cada uno)

aca va el codigo del dpr

Código Delphi [-]
Var
I:integer;
begin

FrmIntroProgreso:=TFrmIntroProgreso.Create(Application);

FrmIntroProgreso.Show;
FrmIntroProgreso.Update;

    Application.Initialize;
    Application.Title:='Nombre Aplicacion';
    FrmIntroProgreso.AlphaBlendValue:=FrmIntroprogreso.AlphaBlendValue+100;

    Application.CreateForm(TDataSir, DataSir);

    Application.CreateForm(TFrmPrincipal, FrmPrincipal);
    Application.CreateForm(TFrmEst, FrmEst);
  FrmIntroProgreso.AlphaBlendValue:=FrmIntroprogreso.AlphaBlendValue+30;
    Application.CreateForm(TFrmBuscador, FrmBuscador);
    Application.CreateForm(TFrmConst, FrmConst);
  FrmIntroProgreso.AlphaBlendValue:=FrmIntroprogreso.AlphaBlendValue+30;
    Application.CreateForm(TFrmCancelR, FrmCancelR);
    Application.CreateForm(TFrmCancelRL, FrmCancelRL);
  FrmIntroProgreso.AlphaBlendValue:=FrmIntroprogreso.AlphaBlendValue+30;
    Application.CreateForm(TfrmSancion, frmSancion);
    Application.CreateForm(TFrmI, FrmI);
  FrmIntroProgreso.AlphaBlendValue:=FrmIntroprogreso.AlphaBlendValue+30;
    Application.CreateForm(TFrmEg, FrmEg);
    Application.CreateForm(TFrmTrasN, FrmTrasN);
  FrmIntroProgreso.AlphaBlendValue:=FrmIntroprogreso.AlphaBlendValue+30;
    Application.CreateForm(TFrmEgr, FrmEgr);
    Application.CreateForm(TfrmS,FrmS);
    Application.CreateForm(TFrmCr,FrmCr);
    Application.CreateForm(TFrmGr, FrmGr);
 
   
for i:=FrmIntroProgreso.Barra.Position to FrmIntroProgreso.Barra.max do
begin
  FrmIntroprogreso.Barra.Stepby(5);
  sleep(10);

end;  
 FrmIntroProgreso.Hide;
 FrmIntroProgreso.Free;
Application.Run;

end.

y durante la carga del primer form (modulo de datos)
Código Delphi [-]

procedure TDataSir.DataModuleCreate(Sender: TObject);
begin
//.......RUTINA PARA ABRIR BASE DE D. Y TABLAS ..........

try
if not SqlConexion.Connected then SqlConexion.Connected:=true;
except
  application.MessageBox('Imposible conectar con la Base de Datos'+#13+'Intente mas Tarde','Aviso del Sistema',MB_OK+MB_ICONEXCLAMATION);
  application.Terminate;
end;

if Sqlconexion.Connected then
begin
    Tabla1.Open;
    Tabla2.Open;

    tabla3.Open;

    consulta1.Open;
   tabla3.Open;
    tabla4.Open;

     consulta2.Open;
     tabla5.Open;
     consulta3.Open;

     consulta4.Open;
      consulta4.Last;

end;
end;

este codigo como ven se ejecuta durante el create del modulo de datos .

el que sigue es al final (aca no es el problema porque la aplicacion si que cierra ):):):):)

Código Delphi [-]
procedure TDataSir.DataModuleDestroy(Sender: TObject);
var
i:integer;
//Nombre:string;
begin
if  SqlConexion.Connected then SqlConexion.Connected:=false;

for i:=0 to self.ComponentCount-1 do
begin
   if (self.Components[i] is TDataSet) then

    if Tdataset(Components[i]).Active then Tdataset(Components[i]).Active:=false;

end;
end;

pues este es el codigo principal yo creo que la cosa esta en el modulo de datos ya que se crea primero alli durante la carga de la conexion y tablas lo que no se es identificar que elemento externo a puede estar afectando ..
por eso pregunto de que servicio depende una aplicacion como esta y como detectar si es el servidor de Bd o la red la que esta interfiriendo ....

GRacias ....

Ivanzinho 14-02-2008 13:07:13

Podrías realizar el debug paso a paso y ver en donde está la tardanza.

En mi opinión creo que puede ser al crear el modulo de datos y la razón por la que antes no tuvieses problema y ahora sí puede ser de la cantidad de datos almacenado en la Base de Datos.

Veo que al crear el módulo de datos realizas el Open de varias tablas, no se si tienes un filtro o no, pero ten en cuenta que existen componentes que al realizar el Open traen todos los datos de la tabla del servidor, otros solo realizan el fetch de los registros necesarios y van realizando fecths sucesivos según se vaya necesitando. No se cuál es tu caso, esto es simplemente un comentario para que lo tengas en cuenta, ya que si los componentes que usas traen todos los datos en el open el problema de la lentitud puede ser el aumento de datos en la B.D.

Tampoco sé si realmente necesitas abrir todas las tablas, procura realizar la petición de datos exclusivamente cuando sea necesario.

Otra cosa, ¿necesitas crear todos los formularios al iniciar la aplicación?, yo te recomendaría crear los necesarios (15 me parecen excesivos) e ir creando el resto segun se solicite.

Realmente no te puedo decir cuál es tu problema, pero pueden ir los tiros por ahí. Prueba lo del debug, así sabrás en que punto se ralentiza.

Un saúdo.

Neftali [Germán.Estévez] 14-02-2008 13:43:25

Cita:

Empezado por Kenobi (Mensaje 265796)
durante la carga de la aplicacion se crean los distintos formularios asi como el modulo de datos (este va de primero) y dentro de el hay pues tablas y consultas (como 15 o menos de cada uno)

Ok, mucho mejor así.
Hay varias cosas que me llaman la atención; Yo te las comento y luego tú verás si está dentro de tus posibilidades modificarlas o no.

(1) Creas todos los formularios al iniciar la aplicación, cosa que no es necesaria. Crea los formularios cuando los vayas a visualizar y destruyelos al ocultarlos. Supongo que al iniciar no necesitas tenerlos todos visibles.

(2) Algo similar pasa con las tablas y consultas. Veo que abres todas al iniciar. Tampoco es necesario si no las vas a utilizar todas en ese momento. Abre cada una en el momento en que la necesites. Incluso en una de ellas haces el Last, con lo que obligas a recorerla toda.
No digo que no debas hacerlo, lo que no se es si es necesario que lo hagas todo en ese punto (al iniciar).

(3) El Sleep(10) es un retardo innecesario que estás introduciendo.

(4) Por último haces un recorrido utilizando ComponentCount; Este método es muy lento. Se puede cambiar y utlkizar un TObjectList para contener los TDataset y hacer el recorrido sobre la lista. (*NOTA*)

Son algunas cosas, lo que sí haría yo es intentar añadir a un Log marcas de tiempo de lo que tarda cada operación. Para saber dónde estás perdiendo tiempo. (*NOTA*) Por ejemplo en el punto (4) tal vez no se esté perdiendo nada de tiempo y al hacer el cambio no ganes nada (y pierdas tiempo de programación).
El fácil poner un Memo oculto y entre las líneas de tu código añadir sentencias como esta:

Código Delphi [-]
  Memo1.Lines.Add('Abriendo tabla 1  ==> ' + DateTimeToStr(Now));
  ...
  Memo1.Lines.Add('Creando form   ==> ' + DateTimeToStr(Now));
  ...  
  Memo1.Lines.Add('Creando form   ==> ' + DateTimeToStr(Now));
  ...

Cuando la carga esté completa, lo grabas a disco utilizando:

Código Delphi [-]
  Memo1.SaveToFIle('c:\temp\Carga.Log');

Con eso tendrás marcas de tiempo aproximadas de lo que está tardando cada parte y así podrás afinar la solución...

Un saludo.

BlueSteel 14-02-2008 15:30:31

Hola...

Leido lo expuesto con anterioridad, se me ocurre que si trabajas con SQL, quizás sea la forma que se instalo SQL y te dejaron la base de datos de un tamaño limitado....

A un colega le paso que una empresa que vende sistemas ERP (Softland)... le instalaron todo, y que llegado un momento todo se volvio super lento y hasta dejar de trabajar.. el problema fue el limite fijado a la base de datos.... la solución realizar un aumento del tamaño de la base de datos... y/o realizar la configuración para que se autoincremente la base de datos (Tambien se debe configurar el tamaño del Log... )....


Quizás este no sea tu caso, pero nunca esta demás mencionarlo...

Salu2:p:D


La franja horaria es GMT +2. Ahora son las 21:25:43.

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