Gracias por al ayuda, esta muy buena la clase que propuso ecfisa, pero no logro que me funcione como necesito, quizas es que estoy haciendo algo mal o omitiendo algo, pudieran ayudarme.
Básicamente lo que necesito es que en lo que se va procesando el procedmiento ProcessFile, me actualice los contadores en pantalla (Label0000 hasta Label2110), pero no lo hace, solo cuando hago clic en el label para detener el hilo es que se ejecuta todo. de lo contrario nunca termina y le tengo puesto a la clase F835File la propiedad EndParse que inicia en falso y cuando termina el proceso toma el valor verdadero, para poder tener referencia que terminó el proceso. La duración de este proceso depende del tamaño del fichero que estoy procesando y me ha durado entre 30seg hasta 2 minutos en los casos que tengo como refrencia.
Código:
procedure TForm1.TimeThreadOnTime;
begin
// aquí el proceso que desees
Inc(FCont);
if FStopThread = false then
begin
FStopThread := true;
ProcessFile;
end;
Label0000.Caption := IntToStr(F835File.Loop0000MaxId);
Label1000.Caption := IntToStr(F835File.Loop1000MaxId);
Label2000.Caption := IntToStr(F835File.Loop2000MaxId);
Label2100.Caption := IntToStr(F835File.Loop2100MaxId);
Label2105.Caption := IntToStr(F835File.Loop2105MaxId);
Label2110.Caption := IntToStr(F835File.Loop2110MaxId);
// fin proceso
Application.ProcessMessages;
if F835File.EndParse then StopThread;
end;
procedure TForm1.ProcessFile;
begin
if FileExists(FFileName) then
begin
F835File.Parse;
if F835File <> nil then
begin
LabelLoop0000.Caption := IntToStr(F835File.Loop0000MaxId);
LabelLoop1000.Caption := IntToStr(F835File.Loop1000MaxId);
LabelLoop2000.Caption := IntToStr(F835File.Loop2000MaxId);
LabelLoop2100.Caption := IntToStr(F835File.Loop2100MaxId);
LabelLoop2105.Caption := IntToStr(F835File.Loop2105MaxId);
LabelLoop2110.Caption := IntToStr(F835File.Loop2110MaxId);
scMemoSchema.Lines.AddStrings(F835File.getSqlSchema);
scMemoDelete.Lines.AddStrings(F835File.getSqlDelete);
scMemoInsert.Lines.AddStrings(F835File.SqlData);
scMemoFileParser.Lines.AddStrings(F835File.ParsedFile);
scMemoLogError.Lines.AddStrings(F835File.LogError);
end;
end;
end;
procedure TForm1.BeginThread;
begin
if not Assigned(TimeThread) then
begin
FCont := 1;
TimeThread:= TTimeThread.Create;
// Intervalo expresado: 1/1000000 seg. (µs)
TimeThread.Interval := 100000; {1/10 seg }
TimeThread.OnTime := TimeThreadOnTime;
TimeThread.Execute;
end;
end;
procedure TForm1.StopThread;
begin
if Assigned(TimeThread) then
TimeThread.Terminate;
end;
procedure TForm1.scLabel21Click(Sender: TObject);
begin
StopThread;
end;
Una vez más gracias y aguardo por su ayuda.