Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Crear aviso "Espere unos minutos" durante operacion con mucha carga de CPU . AYUDA (https://www.clubdelphi.com/foros/showthread.php?t=39245)

Cheerpipe 14-01-2007 23:18:12

Crear aviso "Espere unos minutos" durante operacion con mucha carga de CPU . AYUDA
 
Bien, intentare ser breve.

En mi aplicacion, tengo unos formularios para realizar consultas, las cuales demoran normalmente entre 10 y 15 segundos en el mejor de los casos, pero pueden llegar a demorar un 30 segundos.

La cuestion es que se me ocurrio poner una pantalla ke fuese algo asi como lo siguiente




y lo llamo con el siguiente codigo


Código Delphi [-]

with TfrmWaitForm.create do
try
show;
crearVentana(TfrmInformeCarterosTodosPendientes); //Esta llamada es la que demora..
finally
close;
free;
end;






El formulario se muestra (el de espera) pero no se actualiza, eso debe ser porque la llamada crearVentana(TfrmInformeCarterosTodosPendientes); utiliza mucha CPU y es la que demora.

He probado usando timers para redibujar el formulario de espera, he probado con hilos, y nada, :( no se como hacer para ke el formulario de espera se vea y dibuje a tiempo ke la consulta SQL se ejcuta.


Lo que obtengo es un cuadro plomo (donde se deberia ver el formulario de espera).

El formulario de espera tiene un jvwaitgradient que se mueve de lado, por lo que el formulario debe redibujarse lo suficientemente rapido como para notar la animacion :(.

Espero algun guru de delphi pueda ayudarme.

Atte. Gracias

JF Sebastian 15-01-2007 10:42:55

Has probado Application.ProcessMessages o similar en el bucle donde consume mucha CPU??

Bicho 15-01-2007 10:48:20

Hola, ya tambien abogo por el Application.ProcessMessages sino lo has usado ya.

Pero hay algo que me intriga, no se si es cuestión de la nomenclatura que usas o que, es lo siguiente:

Tienes un formulario que realiza las consultas y luego tienes un form que hace crea una ventana de espera, pero luego tienes esto:

Código Delphi [-]
with TfrmWaitForm.create do
  try
    show;
    crearVentana(TfrmInformeCarterosTodosPendientes); //Esta llamada es la que demora..
  finally
    close;
  free;
end;

¿Creas el Form llamado TfrmWaitForm, y luego el crea las consultas?
De todos modos quizá deberías poner parte del código de la función CrearVentana y la función que realiza las consultas y supuestamente actualizas el form de espera, para ver donde falla.

Saludos

Lepe 15-01-2007 12:24:04

Estoy de acuerdo con Bicho, incluso deberías plantearlo de otra forma si quieres actualizar el mensaje de TWaitForm.

Código Delphi [-]

procedure TfrmInformeCarterosTodosPendientes.Create(....);
var F:TWaitForm;
begin

  F := TWaitForm.Create(self);
  try 
     for i:= 0 to dos millones do
     begin
       F.Label1.Caption := 'Quedan '+ intTostr(Reg)+ ' registros';
       F.Update; // ordenamos que se pinte
       Application.ProcessMessages; // damos un respiro para que se pinte
     end;
  finally
     FreeAndnil(F);
  end;
end;

Hay otras formas de plantearlo, depende de como quieras hacerlo.

Saludos

droguerman 15-01-2007 19:23:55

no has pensado en usar Threads? es un poco más complicado pero está hecho para este tipo de situaciones

fidel 15-01-2007 21:08:02

Hola:

¿ No te funciona una TStatusBar ?

La puedes tener oculta, hacerla visible antes del proceso con el texto que desees en la propiedad Simple Text, y ocualtarla al finalizar.

Un saludo.

Cheerpipe 18-01-2007 13:13:34

ya he probado con hilos pero no con Application.ProcessMessages, como no tenia bucles (puesto que es una consulta sql lo que usa mucho cpu), pero en fin, creo que me he orientado algo mas, por lo que intentare con el aplication.processmessages y les cuento como va.

La cuestion es que cuando el formulario que contiene y muestra los resultados de la consulta, debe enviar algun tipo de mensaje al formulario tWaitForm para detener el bucle lo redibujara.

Gracias por su ayuda.

AzidRain 18-01-2007 19:32:38

Yo lo resolvi de forma simple pero atractiva al usuario. Como no puedes meter código dentro del query para ir actualizando la unica opcion son los threads...pero es mucho problema solo para algo "cosmético"...

Lo que hice fue:
Hago una ventana con opcion de que se quede "siempre encima" en ese form le pongo un TAnimate con alguna de las animaciones que ya trae por defecto.
En el codigo justo antes de abrir el query creo el form, cambio la propiedad Active del TAnimate a true y muestro el form.
Ejecuto el query....(windows se encarga de estar actualizando el form)
al terminar el query, destruyo el form creado
y listo

Ya siendo mas complicado puedes crear tu propio AVI para mostrar en lugar de los que ya trae.


La franja horaria es GMT +2. Ahora son las 23:51:56.

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