Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como Evitar que la Pantalla se "blanquee" durante un proceso (https://www.clubdelphi.com/foros/showthread.php?t=74964)

oscarac 21-07-2011 17:12:46

Como Evitar que la Pantalla se "blanquee" durante un proceso
 
Buenos dias

no sé si a alguno de ustedes le ha pasado que mientras estan haciendo un proceso de actualizacion o la ejecucion de un query complicado el cual demora si minimizamos o pasamos a otra ventana (fuera del sistema) y regresamos al sistema, la pantalla se encuentra en blanco y no aparecen las imagenes (llamese form, botones, grids, etc) hasta que el proceso culmine

he colocado un ProgressBar que me indica el progreso.. pero solo se ve ese componente cuando realizo la accion anterior

algun comentario?

he colocado Application.ProcessMessages pero tampoco me da resultados

x_aguilarf 21-07-2011 18:25:39

Prueba a poner el proceso dentro de un Thread.

Saludos

Chris 21-07-2011 18:37:48

Además, luego que actualices el estado del ProgressBar, utiliza el procedimiento Update del formulario que "queda en blanco".

Saludos,
Chris

oscarac 21-07-2011 18:45:30

estuve revisando informacion sobre Hilos de Ejecucion y esta muy interesante

el tema es que no comprendo bien como implementarlo, les comento lo que estoy haciendo

tengo un form donde hay edits y en cada edit se almacena la ubicacion de un archivo plano para su procesamiento

hay un boton (procesar) que al darle Click, pues hace lo que iene que hacer con los archivos

como hago para aplicar los hilos?

tengo esto

Código Delphi [-]
type
TMiHilo = class(TThread)
  private
    procedure Transferir;
  protected
    procedure Execute; override;
  end;

Código Delphi [-]
 
procedure TMiHilo.Execute;
begin
  Transferir;
end;

la cosa es... como le digo al hilo que funcione cuando doy click en Procesar...


CRIS... no encontre el procedimiento Update en el form :( Uso Delphi 7

Casimiro Notevi 21-07-2011 19:34:59

Estas cosas con linux no pasa porque la multitarea funciona mucho mejor y reparte el tiempo de procesador para no dejar "tirado" a ninguno. Que ese es el problema de la pantalla en blanco, que el procesador no tiene tiempo para repintar la pantalla al estar ocupado con otra cosa.
Si no lo digo... reviento :D

De todas formas este problema que tienes te ocurrirá solamente si usas el mismo equipo como cliente y servidor, ya que si usas un sistema cliente/servidor "normal", o sea, con un equipo haciendo de servidor, no tendrás ese problema porque el ocupado será el servidor, pero no tu ordenador, el cliente.

Chris 21-07-2011 21:19:48

Cita:

Empezado por oscarac (Mensaje 407036)
CRIS... no encontre el procedimiento Update en el form :( Uso Delphi 7

Utiliza un código similar a este:
Código Delphi [-]
ProgressBar1.Step := ...
Formulario.Update; // <-- este es el procedimiento del que te he hablado

Saludos,
Chris

Chris 21-07-2011 21:21:25

Cita:

Empezado por Casimiro Notevi (Mensaje 407046)
De todas formas este problema que tienes te ocurrirá solamente si usas el mismo equipo como cliente y servidor, ya que si usas un sistema cliente/servidor "normal", o sea, con un equipo haciendo de servidor, no tendrás ese problema porque el ocupado será el servidor, pero no tu ordenador, el cliente.

De hecho también ocurrirá aunque tengas distribuido el cliente y el servidor en distintos equipos. El cliente también se "pegará" al esperar la respuesta del servidor.

Saludos,
Chris

oscarac 21-07-2011 21:25:31

lo hice funcionar con hilos
en el evento onClick del button pongo esto y se ejecuta

Código Delphi [-]
 
  TMiHilo.Create(False);

el problema que tuve fue que en la ehjecucion de los comandos del hilo, no me reconocia las tablas ni querys que estaban en el formulario

tuve que invocar al mismo formulario para que lo reconozca

Sin hilo
Código Delphi [-]
 
tblingreso.open
Con hilo
Código Delphi [-]
 
frmrecepcion.tblingreso.open;
es normal eso? o me falto declarar algo

Chris 21-07-2011 21:44:53

Cita:

Empezado por oscarac (Mensaje 407062)
lo hice funcionar con hilos
en el evento onClick del button pongo esto y se ejecuta

Código Delphi [-]
 
  TMiHilo.Create(False);
....
Código Delphi [-]
 
frmrecepcion.tblingreso.open;
es normal eso? o me falto declarar algo

Oscarac, ten en cuenta que la implementación de código o aplicaciones multihilos no es tan sencilla a cómo lo has hecho. El código frmrecepcion.tblingreso.open; te compilará perfectamente sin ningún problema. Sin embargo, este código te generará errores al momento de ejecución ya que por ley dos hilos no pueden escribir sobre una misma variable al mismo tiempo. Es lo que tú estás haciendo con esa línea de código. Estás violentando la ley y esto se verá reflejado en al momento de ejecución.

La clase TThread define un procedimiento especial llamado Synchronize. Este procedimiento es la abstracción más alta de lo que se conoce cómo semáforos. Todas las lecturas/escrituras que hagas a frmrecepcion deben ser por medio del procedimiento Synchronize. Para hacer las lecturas/escrituras por medio de Syncronize, todas éstas deben estar encapsuladas en procedimientos separados.

Saludos,
Chris

oscarac 21-07-2011 22:14:29

entonces tengo que leer mas


La franja horaria es GMT +2. Ahora son las 11:50:04.

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