PDA

Ver la Versión Completa : Crear aviso "Espere unos minutos" durante operacion con mucha carga de CPU . AYUDA


Cheerpipe
14-01-2007, 23:18:12
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

http://img387.imageshack.us/img387/6079/esperandozq1.jpg


y lo llamo con el siguiente codigo


Código Delphi [-] (http://www.clubdelphi.com/foros/#)

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:


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.



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.