Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-03-2019
cmfab cmfab is offline
Miembro
 
Registrado: jun 2010
Posts: 419
Poder: 14
cmfab Va por buen camino
Error en hilos de ejecución

Hola a todos!

Este tema se que se ha tocado varias veces, y por días he estado revisando todo lo que he encontrado. No es primera vez que he trabajado con hilos y me ha funcionado perfectamente. pero en esta ocasión ha sido diferente. Les comento:

Necesito ejecutar dos hilos en una aplicación para rescatar datos de dos tablas diferentes. para ello estoy usando los componentes Firedac, la conexión es ODBC a un proveedor externo.

Los hilos deben ejecutarse en un orden, osea primero uno hilo, después el otro, por lo cual lo que hago es que cuando termina el primer hilo lanzo el segundo.

acá la clase que crea los hilos

Código Delphi [-]
 THiloCheque = Class(TThread)
    Constructor Create(cone: TFDConnection; const SQL: String);
    private
       FSQL: String;
       FConnection: TFDConnection;
       FConsulta: TFDQuery;
    Protected
       Procedure Execute; override;
    Public
       property Consulta: TFDQuery Read FConsulta Write FConsulta;
  End;

  //cheques detalles
  THiloChequeDet = Class(TThread)
    Constructor Create(cone: TFDConnection; const SQL: String);
    private
       FSQL: String;
       FConnection: TFDConnection;
       FConsulta: TFDQuery;
    Protected
       Procedure Execute; override;
    Public
       property Consulta: TFDQuery Read FConsulta Write FConsulta;
  End;

y por poner el ejemplo del primer hilo ya que ambos son idénticos, les dejo el código de creación y ejecución:

Código Delphi [-]
{ THiloCheque }
constructor THiloCheque.create (cone: TFDConnection; const SQL: String);
begin
  inherited Create(false);
  FConnection := cone;
  FSQL := SQL;
end;

procedure THiloCheque.Execute;
begin
  inherited;
  CoInitialize(nil);
  consulta := TFDQuery.Create(application);
  With consulta do begin
      try
        ResourceOptions.EscapeExpand:=false;
        ResourceOptions.MacroCreate :=false;
        ResourceOptions.MacroExpand :=false;
        Connection := FConnection;
        SQL.Add(FSQL);
        Open;
      Except
         on e:Exception do
             errores('Error en la captura de cheques: ' + e.Message );
     end;
  end;
  CoUnInitialize;
end;


Estos hilos se ejecutan cada 20 segundos aproximadamente y actualizan una grilla de datos, el código de la llamada sería este:

primero el hilo que me trae los datos del detalle de los cheques

Código Delphi [-]
 With THiloChequeDet.Create(v_con, 'Select * from lineasCheck ') do
        begin
          FreeOnTerminate := true;
          OnTerminate := TerminaHiloChequeDet;
        end;

cuando termina este primer hilo se realizan dos operaciones:
1- Se asigna el valor de la consulta a un componente FDMmemTable, previamente creado.
2- Se lanza el segundo hilo

acá el código

Código Delphi [-]
procedure TFPrincipal.TerminaHiloChequeDet(Sender: TObject);
begin
  
  if consCheqDet.Active then consCheqDet.close;

  if THiloChequeDet(Sender).Consulta.Active  then
   consCheqDet.Data := THiloChequeDet(Sender).Consulta.Data;  

  THiloChequeDet(Sender).Consulta.Free;

 
  With THilocheque.Create(v_con,  'Select * from check' ) do
      begin
        FreeOnTerminate := true;
        OnTerminate := TerminaHiloCheque;
      end;
end;

Cuando termina el segundo hilo básicamente se hace lo mismo, se actualizan los datos y se libera el objeto consulta que es el TFDQuery creado en el hilo<

Problema:

Lo que sucede es que esto se ejecuta cada x segundos programados en un TTimer, funciona bien pero al cabo de unas horas o el programa se queda congelado, o las consultas nunca terminan, o salta una excepción con memoria o recursos insuficientes. Entonces me pregunto porqué puede estar pasando esto si los hilos en buena teoría se deberían estar destruyendo al terminar el proceso y además el único objeto que se crea en el hilo como tal es "Consulta!, y lo destruyo cuando este termina de ejecutarse. por otro lado el segundo hilo se ejecuta cuando termina el primero.

Alguna idea?

Gracias
Responder Con Cita
  #2  
Antiguo 16-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Cuántos registros aproximadamente devuelve la sentencia 'select * from lineascheck' y cuánto tarda en ejecutarse?
Responder Con Cita
  #3  
Antiguo 16-03-2019
cmfab cmfab is offline
Miembro
 
Registrado: jun 2010
Posts: 419
Poder: 14
cmfab Va por buen camino
Son pocos los registros que trae, en las pruebas que estoy haciendo no más de 5, y demora unos 3, 4 segundos
Responder Con Cita
  #4  
Antiguo 16-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿4 registros y 4 segundos?

¿Para qué se necesitan los hilos?
Responder Con Cita
  #5  
Antiguo 16-03-2019
cmfab cmfab is offline
Miembro
 
Registrado: jun 2010
Posts: 419
Poder: 14
cmfab Va por buen camino
Los hilos se necesitan porque la consulta puede ser mayor, además el tema es que esta aplicación va a conectarse a una base de datos de una empresa que está trabajando todo el tiempo con su plataforma y los registros que genere de cheques van a ser procesados por esta app externa. la idea es que trabaje en segundo plano sin intervención del usuario.
Responder Con Cita
  #6  
Antiguo 18-03-2019
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.275
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
¿Seguro que estás liberando todos los recursos creados?
Prueba a activar ReportMemoryLeaksOnShutdown (busca en los foros si no te suena) para ver si se te están quedando recursos "colgados".
¿Dónde están definidos los procedimientos: TerminaHiloChequeDet y TerminaHiloCheque?
__________________
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
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
Ejecución bloqueada. Hilos de ejecución muli Desarrollo en Delphi para Android 10 28-11-2016 15:16:03
Crear Hilos de Ejecución con TIdFTP JAI_ME Varios 12 13-12-2013 18:28:39
Ayuda con Hilos de ejecucion kurono Varios 19 15-01-2011 15:36:40
Problema con hilos de ejecucion gueritox OOP 1 14-08-2010 15:26:06
Hilos de ejecucion el toluca Varios 2 29-06-2004 22:59:04


La franja horaria es GMT +2. Ahora son las 23:26:16.


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