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;
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
[-]
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