Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-12-2006
Avatar de vaporlalibre
vaporlalibre vaporlalibre is offline
Registrado
 
Registrado: nov 2006
Posts: 8
Poder: 0
vaporlalibre Va por buen camino
Question Ayuda con una consulta continua

Que tal buenas noches, necesito ayuda por favor, mi problema es que hice una agenda como parte de un sistema, en la cual escribi una parte donde introducia una fecha y una hora cualquiera en una base de datos (mysql) por medio de la aplicación, y en un timer la consulta sql que comparaba segundo a segundo si la hora del sistema (en la aplicación la puse en un label conectado a un timer), correspondia a la hora y fecha guardada en la tabla. Al hacer esto me garantizaba una consulta continua asi al llegar la hora señalada me arrojaba un mensaje, avisandome de la tarea pendiente.

Sin embargo segundo a segundo mi cursor cambia por un cursor con simbolo de Sql con el reloj de arena, esto cada segundo que se realiza la consulta SQL y esto pone lento mi aplicación ademas de que se ve anti-estetico, pues en una consulta normal pasa rapido y se ve de vez en cuando, pero asi de esta forma se ve cada segundo.

¿Como podria mejorar esta situación?, les agradecere su respuesta.
Responder Con Cita
  #2  
Antiguo 04-12-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿Qué componentes estás usando? En dbExpress, la componente SQLConnection tiene la propiedad booleana SQLHourGlass para controlar eso. Eso sí, no me parece lógico que eso sólo sea lo que esté alentando la aplicación.

// Saludos
Responder Con Cita
  #3  
Antiguo 04-12-2006
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
Cita:
Empezado por roman
Eso sí, no me parece lógico que eso sólo sea lo que esté alentando la aplicación.
Pues a mí, si. Cada segundo está chequeando en la base de datos en busca de avisos pendientes. A mí lo que no me parece lógico, es estar cada segundo haciendo consultas al servidor por eso.

Imaginate que este programa lo tiene 100 usuarios en una empresa mediana, habría 100 consultas de ese programa que está en marcha todo el tiempo sobre el servidor, además de las que se estén haciendo por otro proceso.
Vale que el servidor puede estar preparado y no debería haber problemas, y me estoy yendo por los cerros de úbeda.
Lo que yo quiero decir, es que para un tema como el de avisos, tipo alarma o agenda, no me parace, a mi, la mejor opción la de estar chequeando cada segundo en la base de datos si hay avisos pendiente.

Yo apostaría por tener esa lista en memoria, o en su defecto en un fichero temporal. Por ejemplo, al arrancar la aplicación, que cargue de la base de datos en un fichero, los avisos pendientes para hoy, si se genera algún aviso para hoy, se cargará en el fichero.
Luego que el programa chequee, cada minuto, como minimo, ese fichero y chequee los avisos y los trate según convega.
No sé alomejor tengo una concepción mala, pero para este tipo de avisos (información breve y puntual) prefiero tenerla en memoria o en un fichero de fácil acceso.

No sé, ¿qué opinan ustedes?

Saludos
Responder Con Cita
  #4  
Antiguo 04-12-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Bicho
Pues a mí, si.
Me refería al cambio de cursor.

// Saludos
Responder Con Cita
  #5  
Antiguo 04-12-2006
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
Sorry lo entendí mal.
Y estoy contigo, no debería ser motivo para el relentizado de la aplicación.

Saludos
Responder Con Cita
  #6  
Antiguo 05-12-2006
Avatar de vaporlalibre
vaporlalibre vaporlalibre is offline
Registrado
 
Registrado: nov 2006
Posts: 8
Poder: 0
vaporlalibre Va por buen camino
Cita:
Empezado por Bicho
Pues a mí, si. Cada segundo está chequeando en la base de datos en busca de avisos pendientes. A mí lo que no me parece lógico, es estar cada segundo haciendo consultas al servidor por eso.

Imaginate que este programa lo tiene 100 usuarios en una empresa mediana, habría 100 consultas de ese programa que está en marcha todo el tiempo sobre el servidor, además de las que se estén haciendo por otro proceso.
Vale que el servidor puede estar preparado y no debería haber problemas, y me estoy yendo por los cerros de úbeda.
Lo que yo quiero decir, es que para un tema como el de avisos, tipo alarma o agenda, no me parace, a mi, la mejor opción la de estar chequeando cada segundo en la base de datos si hay avisos pendiente.

Yo apostaría por tener esa lista en memoria, o en su defecto en un fichero temporal. Por ejemplo, al arrancar la aplicación, que cargue de la base de datos en un fichero, los avisos pendientes para hoy, si se genera algún aviso para hoy, se cargará en el fichero.
Luego que el programa chequee, cada minuto, como minimo, ese fichero y chequee los avisos y los trate según convega.
No sé alomejor tengo una concepción mala, pero para este tipo de avisos (información breve y puntual) prefiero tenerla en memoria o en un fichero de fácil acceso.

No sé, ¿qué opinan ustedes?

Saludos
Eso suena bien, peroexactamente como haria eso, asi ya no cargaria desde el servidor, si no desde memoria local.
Responder Con Cita
  #7  
Antiguo 05-12-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No sé yo que tan malo sea estar consultando al servidor. Verás, yo tengo un sistemita, claro que con pocos usuarios, no más de diez simultáneos, en donde cada cliente debe "avisar" al servidor cada tanto que aún sigue vivo. Esto lo hago cada 30 segundos y no he tenido ningún problema en tres años que ha corrido.

Es que un segundo es un exceso pero normalmente, si una tarea tiene un retraso de 30 segundos nadie se va a morir. Así que podrías también intentar esa opción. Ya si no mejora pruebas otra cosa.

// Saludos
Responder Con Cita
  #8  
Antiguo 05-12-2006
Avatar de vaporlalibre
vaporlalibre vaporlalibre is offline
Registrado
 
Registrado: nov 2006
Posts: 8
Poder: 0
vaporlalibre Va por buen camino
Smile

Me gustaria realizar esta consulta cada 5 minutos por lo menos, pero no se como, si alguien pudiera por favor, poner aqui un codigo delphi, donde cada 5 minutos me mande un mensaje, ya yo sustituiria ese mensaje por mi codigo de consulta. Por favor lo agradeceria mucho.

P.D. Utilizo Delphi7
Responder Con Cita
  #9  
Antiguo 05-12-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto


No entiendo, ¿sabes lanzar la consulta cada segundo pero no cada cinco minutos? Es nada más cuestión de cambiar la propiedad Interval del timer: 5*60*1000

// Saludos
Responder Con Cita
  #10  
Antiguo 05-12-2006
Avatar de vaporlalibre
vaporlalibre vaporlalibre is offline
Registrado
 
Registrado: nov 2006
Posts: 8
Poder: 0
vaporlalibre Va por buen camino
no se hacerloca da seguno automaticamente el timer lo hace, pues un timer lo tengo enlzadado a un label para que muestre la hora de esta manera:

procedure TForm11.Timer1Timer(Sender: TObject);
begin
label8.Caption:=timetostr(time);
label4.Caption:=datetostr(date);
end;

El segundo label es para la hora.

Y el segundo timer tengo este codigo, pero quiero que lo ejecute cada 5 minutos, de hecho no he encontrado como manejar eso de los intervalos.

procedure TForm11.Timer2Timer(Sender: TObject);
begin
datamodule.DataModule1.Agenda3.SQL.Text:='select * from agenda where hora=(:valor) and fecha=(:valor2)';
datamodule.DataModule1.Agenda3.Params[0].Value:=label8.Caption;
datamodule.DataModule1.Agenda3.Params[1].Value:=label4.Caption;
datamodule.DataModule1.Agenda3.Open;
if label8.Caption = dbedit1.Text then
begin
showmessage('Tarea pendiente');
end;
end;
procedure TForm11.Edit9KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
begin
bitbtn3.SetFocus;
end;
end;
Responder Con Cita
  #11  
Antiguo 05-12-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Pues eso, la propiedad Interval especifica cada cuanto se ejecuta el evento OnTimer (en milisegundos) Por defecto está en 1000 (1 segundo), por ello tienes que ponerle 5 (minutos) * 60 (segundos) * 1000 = 300000

// Saludos
Responder Con Cita
  #12  
Antiguo 05-12-2006
Avatar de vaporlalibre
vaporlalibre vaporlalibre is offline
Registrado
 
Registrado: nov 2006
Posts: 8
Poder: 0
vaporlalibre Va por buen camino
Excelente, muchas gracias, una ultima pregunta el intervalo de 5 minutos a cada 5 minutos del sistema, o cada 5 minutos a partir de que se inicia la aplicación.
Responder Con Cita
  #13  
Antiguo 05-12-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por vaporlalibre
a cada 5 minutos del sistema
No entiendo a qué te refieres con esto. La primera vez que se ejecuta el evento será a los cinco minutos de que su propiedad Enabled se ponga en true. Como por defecto está en true. entonces se ejecutará la primera vez a los cinco minutos de iniciada la aplicación.

Luego de esto, se ejecutará cada cinco minutos.

// Saludos
Responder Con Cita
  #14  
Antiguo 05-12-2006
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
Cita:
Empezado por roman
No sé yo que tan malo sea estar consultando al servidor. Verás, yo tengo un sistemita, claro que con pocos usuarios, no más de diez simultáneos, en donde cada cliente debe "avisar" al servidor cada tanto que aún sigue vivo. Esto lo hago cada 30 segundos y no he tenido ningún problema en tres años que ha corrido.

Es que un segundo es un exceso pero normalmente, si una tarea tiene un retraso de 30 segundos nadie se va a morir. Así que podrías también intentar esa opción. Ya si no mejora pruebas otra cosa.
Yo lo que dije es que me parecia excesivo hacer la consulta cada segundo para cada usuario. Pero ponerlo a 30 segundos o cada cinco como al final se ha decidido, no veo problemas. Quizá yendo cada segundo no los habría, pero no sé, no me convence la idea

En cuanto a lo del timer, para quede claro o más liado todavía
El timer se activa tiene la propiedad Enabled que es la que dice si el reloj tiene que estar en marcha o no. Si está a True en diseño, al ejecutar la aplicación, arrancará el timer, con lo cual, a los 5 minutos de arrancar hará la consulta.
Por contra, sino está en marcha el timer al arrancar la aplicación o lo has detenido por cualquier cosa, éste queda desactivado hasta que vuelvas tú a darle la propiedad Enabled a True.

Espero quede más claro. No quiero decir que roman lo haya liado, alomejor lo he liado yo, pero en fin...

Saludos
Responder Con Cita
  #15  
Antiguo 05-12-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
En cuanto a la lista en memoria:

Puedes pedir un listado de las tareas para hoy que devuelva cuanto falta para que llegue (ordenado ascendentemente), por ejemplo fecha_y_hora_de_la_tarea - now) así puedes establecer el intervalo del timer a esa cantidad.

Solo se consulta al servidor una vez. En el evento Ontimer, la tarea ha caducado, lo muestras al usuario y vuelves a pedir la lista al servidor. En realidad no es una lista, al estar ordenado por el tiempo que falta, solo necesitas la primera tarea que caduque (1 registro).

En caso de que alguien agregue/modifique una tarea para hoy, en el servidor haces un Post_event para que los clientes pidan de nuevo esa lista.

Creo que será más eficiente que consultar cada 5 minutos, a menos que se esté continuamente añadiendo tareas para el mismo día desde muchos clientes.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #16  
Antiguo 05-12-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Lepe
En caso de que alguien agregue/modifique una tarea para hoy, en el servidor haces un Post_event para que los clientes pidan de nuevo esa lista.
¿A qué te refieres con esto?

// Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Lectura continua de Archivo friendspark API de Windows 2 02-02-2006 16:27:52
Mendocino: continúa la dupla SAP-Microsoft marcoszorrilla Noticias 0 28-04-2005 22:18:05
Reproduccion continua de un video avi alexmucho C++ Builder 1 09-09-2004 11:58:21
Impresion continua de los campos de una tabla? tayra Impresión 11 03-06-2004 21:15:41
el problema continua! merlin Impresión 1 15-01-2004 15:01:18


La franja horaria es GMT +2. Ahora son las 17:10:13.


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
Copyright 1996-2007 Club Delphi