Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Desarrollo en Delphi para Android
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-09-2015
muli muli is offline
Miembro
 
Registrado: jun 2003
Ubicación: A Coruña
Posts: 193
Poder: 21
muli Va por buen camino
Ejecución bloqueada. Hilos de ejecución

Hola a todos. Tengo una aplicación en Android con xe6 que cuando abre una base de datos que tengo en la tarjeta microsd de la tablet, pasa un rato y parece que queda bloqueada, pero no lo está, intenté poner un aniIndicator para que mientras se abre el query y rellena un listview con los datos se mueva el circulito para que el usuario no crea que tiene la aplicación bloqueada. Estuve viendo en san google el asunto de los thread, pero no me aclaro mucho y la información es bastante escasa,alguna ayuda para que cuando le doy a query.open, aparezca el aniIndicator y se mueva hasta que el query finalice de traer los datos.

Saludos. a todos.
__________________
SI UN PROBLEMA TIENE SOLUCION, YA NO ES UN PROBLEMA, Y SI NO LA TIENE PARA QUE PREOCUPARSE.
Responder Con Cita
  #2  
Antiguo 25-09-2015
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Échale un vistazo a este link.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 11-10-2015
muli muli is offline
Miembro
 
Registrado: jun 2003
Ubicación: A Coruña
Posts: 193
Poder: 21
muli Va por buen camino
No consigo que avance la barra de progreso.

Este es el código que uso después de visionar diferentes paginas de creación de threads, pero la barra de progreso no avanza, yo lo que quiero es que avance mientras no termina de abrirse la fuente de datos, para que el usuario no crea que la aplicación ha quedado colgada. También pensé en realizar el hilo con la fuente de datos, pero al terminar el hilo pierdo toda la referencia a los datos, por lo que no me sirve. Estoy trabajando con Delphi xe6 y para android. Si en lugar de una barra de progreso se tiene que hacer con una animación, me da igual, el caso es que la aplicación realice algo mientras abre los datos, tampoco son muchos registros, una vez abierta la fuente de datos se mueven perfectamente, incluso si hago un update de un registro es instantáneo.

Código Delphi [-]
// Declaro thread
THilo = class(TThread)
  Progreso: TProgressBar;
  procedure Execute; override;
  procedure ActualizarProgreso;
end;

  Hilo1: THilo; // variable global o pública
  Avance : Integer;

Implementation

procedure THilo.ActualizarProgreso;
begin
  Avance:=Avance+1;
  Progreso.Value:=Avance;
  if Avance>100 then
  Begin
    Avance:=0;
  End;
end;

procedure THilo.Execute;
begin
  inherited;
  FreeOnTerminate := True;
  while not Terminated do
  begin
    Synchronize(ActualizarProgreso);
  end;
end;

// Hasta aquí tengo los procedimientos del thread.
// Luego en el procedimiento de abrir los datos tengo esto.
Procedure TForm1.AbrirDatos.
Begin
    ProgressBar1.Value:=0;  // Inicio la barra de progreso.
    ProgressBar1.Visible:=True;
    Avance:=0;

    Hilo1 := THilo.Create(True);  // Creo hilo de ejecución.
    Hilo1.Progreso := ProgressBar1;
    Hilo1.Resume;
// Abro datos. Omito campos para hacerlo mas legible.
    Query1.Close;
    Query1.SQL.Clear;
    Query1.Connection:=FdConnection1;
    Query1.SQL.Add('Select *  From Registros Where Actual=0');
    Query1.SQL.Add('Order By Direccion');
    if not Query1.Prepared then Query1.Prepare;
    Query1.Open;
// Finalizo thread.
  Hilo1.Terminate;
  FreeAndNil( Hilo1 );
__________________
SI UN PROBLEMA TIENE SOLUCION, YA NO ES UN PROBLEMA, Y SI NO LA TIENE PARA QUE PREOCUPARSE.
Responder Con Cita
  #4  
Antiguo 11-10-2015
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Así a primeras, lo que veo es que la variable avance, está definida fuera del thread y la estás utilizando dentro.
defínela dentro, pues no es necesarias fuera, o incluso elimínala, pues no la necesitas.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 12-10-2015
muli muli is offline
Miembro
 
Registrado: jun 2003
Ubicación: A Coruña
Posts: 193
Poder: 21
muli Va por buen camino
Nada amigo, elimino la variable avance y en su lugar pongo, pero la barra de progreso ni siquiera se mueve, incluso pasa una cosa curiosa en tiempo de diseño le tengo valor 80 para ver el color de la barra y no se lo quite, cuando inicio el procedimiento puedes ver que le paso el valor 0, y ni nada, no hace caso.

Código Delphi [-]
  Progreso.Value:=Progreso.Value+1;
  if Progreso.Value>100 then
  Begin
    Progreso.Value:=0;
  End;
__________________
SI UN PROBLEMA TIENE SOLUCION, YA NO ES UN PROBLEMA, Y SI NO LA TIENE PARA QUE PREOCUPARSE.
Responder Con Cita
  #6  
Antiguo 12-10-2015
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Estas haciendo todo al revez.

La GUI corre en el thread principal y lo estas poniendo en un background. La parte "lenta" la estas dejando en el thread ppal, bloqueando la GUI.

No hay razon (normalmente) para poner GUI dentro de otro thread, siempre usa otros threads para correr de forma concurrente CPU/IO intensivo.

Por otro lado, si es solo poner un "espera mientras", entonces no tienes que hacer esto. Solo arranca el spinner al inicio, ejecuta la parte "lenta" y paras el spinner al final.

Porque ademas, ese progreso que tienes no sirve de nada...

Y estas masacrando la CPU al tener un while sin un respiro (un sleep o una tarea asincronica).

Y es mala cosa "matar" threads.

Mejor dicho, estudia mas sobre este tema
__________________
El malabarista.
Responder Con Cita
  #7  
Antiguo 12-10-2015
muli muli is offline
Miembro
 
Registrado: jun 2003
Ubicación: A Coruña
Posts: 193
Poder: 21
muli Va por buen camino
No estoy haciendo ninguna espera, lo que quiero es que mientras el query trae los registros se mueva la barra de progreso, para que no parezca que la aplicación está congelada, o sea, que el usuario vea movimiento mientras se realiza la consulta.

Algún enlace entendible para estudiar más del tema.
__________________
SI UN PROBLEMA TIENE SOLUCION, YA NO ES UN PROBLEMA, Y SI NO LA TIENE PARA QUE PREOCUPARSE.
Responder Con Cita
  #8  
Antiguo 12-10-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Revisa este post
Responder Con Cita
  #9  
Antiguo 12-10-2015
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Ya te explique el problema. Lee con cuidado.

Si simplementes copias/pegas un codigo por ahi sin entender como hacer multi-hilos terminaras sin querer incorporando bug(s) y/o haciendo el codigo mas ineficiente.

Un computador moderno (ie: De menos de 4 años para aca) es suficientemente rapido para hacer casi de todo en forma secuencial, y la mayoria de los lenguajes (como delphi) no son optimos para hacer concurrencia, asi que es facil hacer algo con problemas.
__________________
El malabarista.
Responder Con Cita
  #10  
Antiguo 12-10-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Estoy casi completamente de acuerdo

Digo casi porque para el caso de mostrar un "espere por favor" mientras se hace cierto procesamiento y no bloquear la UI es algo bastante sencillo en Delphi. Aunque admito que si hay que realizar calculos en paralelo y sincronizacion con Delphi es bastante mas complicado
Responder Con Cita
  #11  
Antiguo 28-11-2016
NicolasP NicolasP is offline
Miembro
 
Registrado: may 2013
Posts: 28
Poder: 0
NicolasP Va por buen camino
AniIndicator con Android

Tema viejo , pero hago un aporte. Después de buscar y leer por varios días post que dicen "lea este post..." lo pude hacer funcionar el AniIndicator para que se "mueva" con un proceso.
Me funciona en windows y también en Android 6.0 con D X7

Form Principal.
Código Delphi [-]
procedure TFmMAin.SB_DbReadClick(Sender: Tobject);

begin

 PAnelAviso.Visible := true;
 AniIndicator1.Enabled := true;
 Hilo := THilo.Create(True);
 Hilo.Start;
 while not Hilo.Finished do
  begin
   ProgressBar1.value := ProgressBar1.Value +1;
   sleep(20);
   if ProgressBar1.Value = 100 then
     ProgressBar1.Value := 0;
     Application.ProcessMessages;
  end;
 ProgressBar1.Value := 0;
 AniIndicator1.Enabled := false;
 PAnelAviso.Visible := false;

.....

Nota: El AniIndicator esta en un Panel. Le puse también un Progressbar para ver si funcionaban juntos. y funcionan!. Sin en el Application.ProcessMessages no funcionan.


Unidad para el proceso

Código Delphi [-]
unit procesos;

interface
uses
Classes, SysUtils;

type
  THilo = class(TThread)
  protected
  procedure Execute; override;
end;


implementation
 uses main;

procedure THilo.Execute;
begin
  FmMain.RestRequest1.Execute;
end;

end.


No se si es eficiente, pero no me importa. Lo importante que el usuario crea que lo es (ja) . Y vea que su dispositivo esta "pensando" ... después le podemos echar la culpa a las comunicaciones, etc....
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Crear Hilos de Ejecución con TIdFTP JAI_ME Varios 12 13-12-2013 19:28:39
Ayuda con Hilos de ejecucion kurono Varios 19 15-01-2011 16:36:40
Problema con hilos de ejecucion gueritox OOP 1 14-08-2010 16:26:06
Aplicacion con varios Hilos de Ejecución samantha jones Varios 1 02-03-2005 18:27:24
Hilos de ejecucion el toluca Varios 2 29-06-2004 23:59:04


La franja horaria es GMT +2. Ahora son las 00:49: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
Copyright 1996-2007 Club Delphi