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 Temas de Hoy


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-04-2024
jmbarrio jmbarrio is offline
Miembro
 
Registrado: may 2003
Posts: 101
Poder: 22
jmbarrio Va por buen camino
Error en Thread (hilo) Android

Buenas tardes, tengo un trozo de código que recorre los registros de una tabla de memoria y para cada uno de ello hace un insert en una base de datos. Al ejecutarlo en android lo ejecuta bien pero tarda alrededor de 10 segundos y me sala un mensaje en pantalla de que la aplicación no respònde y me pide esperar o aceptar.
Mirando en el foro, vi que lo mejor era hacer un hilo. El código del hilo lo creo en un bottonclick.

Código Delphi [-]
Thread := TThread.CreateAnonymousThread(
    procedure
      begin
         while not FDMemTable1.Eof do
    begin
      try
        with F_data.FDQryInsertCliente do
          begin
            Active := False;
            Sql.Clear;
            sqlstr:= 'Insert into clientes (CLI_COD, CLI_NOMCOM, CLI_DIRCOM, CLI_DIRPOB, CLI_ZONA) values(' + '''' + FDMemTable1.FieldByName('cli_cod').AsString + '''' +
                     ',' + '''' + StringReplace(FDMemTable1.FieldByName('cli_rsocial').AsString, '''', '', [rfReplaceAll, rfIgnoreCase]) + '''' + ',' +
                     '''' + StringReplace(FDMemTable1.FieldByName('cli_direc').AsString, '''', '', [rfReplaceAll, rfIgnoreCase]) + '''' +
                     ',' + '''' + StringReplace(FDMemTable1.FieldByName('cli_pobla').AsString, '''', '', [rfReplaceAll, rfIgnoreCase]) + '''' + ',' + '''' +
                     FDMemTable1.FieldByName('cli_zona').AsString + '''' + ')';
            Sql.add(sqlstr);
            ExecSQL;
          end;
        contador := contador + 1;
        FDMemTable1.Next;
        //label1.Text := contador.ToString + ' de ' + nClientes.ToString;
        //sleep(1);
        TThread.Synchronize(TThread.CurrentThread,
        procedure
        begin
        Progressbar1.Value := Progressbar1.Value +1
        end);
        //Application.ProcessMessages;


      except
        on e:exception do
          showmessage(e.Message + ' ' + sqlstr)
      end;
    end;

      end);

  Thread.FreeOnTerminate := True;
  Thread.Start;
  showmessage('Sincronizacion de Clientes Completada. ' + contador.ToString + 'Clientes Traspasados');

el programa no recorre los registros de la tabla de memoria, me sale el mensaje Sincronizacion de clientes completada. 0 clientes traspasados.
Y seguidamente se va llenando la barra de progreso.

Podéis echarme una mano a ver que estoy habiendo mal.?

Muchas gracias, un saludo.
Responder Con Cita
  #2  
Antiguo 09-04-2024
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 549
Poder: 18
jhonalone Va por buen camino
Hola jmbarrio.
Tuve un problama parecido, echa un vistazo a este hilo.

Los consejos de dani36652, me ayudaron a resolver el problema.

Un saludo.
__________________
"Pedid y se os dará; buscad y hallaréis ..." (Lc 11,9-10)
"...si no tengo caridad, nada soy..." (1 Cor 13,1-13)
Responder Con Cita
  #3  
Antiguo 09-04-2024
jmbarrio jmbarrio is offline
Miembro
 
Registrado: may 2003
Posts: 101
Poder: 22
jmbarrio Va por buen camino
Hola Johnalone, lo que estuve viendo fue esa ayuda que comentas. Pero es que no se que hago mal en el código ya que no recorre los registros de la tabla de memoria.

Gracias, un saludo.
Responder Con Cita
  #4  
Antiguo 09-04-2024
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.412
Poder: 22
fjcg02 Va camino a la fama
Hola,

prueba a poner FDMemTable1.First al principio del todo.

Todo supone que se cumple la condición FDMemTable1.Eof y no recorre el bucle.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #5  
Antiguo 09-04-2024
jmbarrio jmbarrio is offline
Miembro
 
Registrado: may 2003
Posts: 101
Poder: 22
jmbarrio Va por buen camino
Cita:
Empezado por fjcg02 Ver Mensaje
Hola,

prueba a poner FDMemTable1.First al principio del todo.

Todo supone que se cumple la condición FDMemTable1.Eof y no recorre el bucle.

Saludos
El first lo tengo antes de la declaración del hilo, te refieres a meterlo dentro del procedure del Hilo?

Gracias, un saludo.
Responder Con Cita
  #6  
Antiguo 09-04-2024
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.549
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
Cita:
Empezado por jmbarrio Ver Mensaje
...tengo un trozo de código que recorre los registros de una tabla de memoria y para cada uno de ello hace un insert en una base de datos. Al ejecutarlo en android lo ejecuta bien pero tarda alrededor de 10 segundos y me sala un mensaje en pantalla de que la aplicación no respònde y me pide esperar o aceptar.

Mirando en el foro, vi que lo mejor era hacer un hilo. El código del hilo lo creo en un bottonclick.
Podéis echarme una mano a ver que estoy habiendo mal.?
Como solución genérica, pasar las cosas a un Thread cuando el programa se ralentiza puede ser una buena opción, pero no siempre es la más adecuada, ya que los threads tienen sus particuladidades.
Tampoco vale, coger el código "antiguo", pasarlo a un thread y esperar que funcione (tal vez sí, pero no suele ser lo habitual).

Lo primero decir, que las operaciones con Bases de Datos en threads, en según qué casos requieren conexiones diferenes. Por ejemplo, en ADO no puedes usar la misma conexión en 2 threads, porque el componente de conexión no es "thread-safe";En el caso de Firedac hay que mirar bien las especificaciones, porque también tiene sus partocularidades (https://docwiki.embarcadero.com/RADS...ading_(FireDAC)).

En segundo lugar, veo que estás accediendo a componentes directamente desde el thread que están definidos "fuera" (F_data, FDMemTable1, contador); Almenos yo no los veo ahí. Ese acceso te va a dar problemas, puesto que lo estás haciendo sin sincronizar.

Este código no tiene sentido:
Código Delphi [-]
Thread.Start;
showmessage('Sincronizacion de Clientes Completada. ' + contador.ToString + 'Clientes Traspasados');

El ShowMessage va a salir nada más iniciar el proceso, no al final.
__________________
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
  #7  
Antiguo 09-04-2024
jmbarrio jmbarrio is offline
Miembro
 
Registrado: may 2003
Posts: 101
Poder: 22
jmbarrio Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
Como solución genérica, pasar las cosas a un Thread cuando el programa se ralentiza puede ser una buena opción, pero no siempre es la más adecuada, ya que los threads tienen sus particuladidades.
Tampoco vale, coger el código "antiguo", pasarlo a un thread y esperar que funcione (tal vez sí, pero no suele ser lo habitual).

Lo primero decir, que las operaciones con Bases de Datos en threads, en según qué casos requieren conexiones diferenes. Por ejemplo, en ADO no puedes usar la misma conexión en 2 threads, porque el componente de conexión no es "thread-safe";En el caso de Firedac hay que mirar bien las especificaciones, porque también tiene sus partocularidades (https://docwiki.embarcadero.com/RADS...ading_(FireDAC)).

En segundo lugar, veo que estás accediendo a componentes directamente desde el thread que están definidos "fuera" (F_data, FDMemTable1, contador); Almenos yo no los veo ahí. Ese acceso te va a dar problemas, puesto que lo estás haciendo sin sincronizar.

Este código no tiene sentido:
Código Delphi [-]
Thread.Start;
showmessage('Sincronizacion de Clientes Completada. ' + contador.ToString + 'Clientes Traspasados');

El ShowMessage va a salir nada más iniciar el proceso, no al final.
Hola Neftalí, tienes toda la razón, pensaba que el showmessage saldría al finalizar el hilo. ¿Cómo puedo enterarme de la finalización del hilo para yo poder sacar ese mensaje?
Gracias. un saludo
Responder Con Cita
  #8  
Antiguo 09-04-2024
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.549
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
Cita:
Empezado por jmbarrio Ver Mensaje
...pensaba que el showmessage saldría al finalizar el hilo. ¿Cómo puedo enterarme de la finalización del hilo para yo poder sacar ese mensaje?

Prueba con el evento OnTerminate del TThread.
Aunque sigo pensando que este es el menor de tus problemas. Creo que si no cambias código ese thread te va a dar problemas.
__________________
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
  #9  
Antiguo 09-04-2024
jmbarrio jmbarrio is offline
Miembro
 
Registrado: may 2003
Posts: 101
Poder: 22
jmbarrio Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
Prueba con el evento OnTerminate del TThread.
Aunque sigo pensando que este es el menor de tus problemas. Creo que si no cambias código ese thread te va a dar problemas.
Ya he conseguido que funcione como yo quería, muchas gracias por toda la ayuda. Es mi primera apk para android y estáis siendo de gran ayuda.

Hasta la próxima.

Un saludo a tod@s
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
Thread Firemonkey Android query amadis FireMonkey 2 23-09-2020 13:04:03
Se puede evitar cerrar un thread o hilo DarkSton Varios 6 14-07-2017 18:47:54
Error: terminate thread timeout ppalmamichi Varios 0 21-08-2012 21:03:47
Error en mi Thread Paulao Varios 3 16-02-2011 16:36:08
Thread bendito thread...se me pierde la ventana Seba.F1 API de Windows 5 02-02-2006 01:16:30


La franja horaria es GMT +2. Ahora son las 01:09:09.


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