Neste post, vou mostrar um exemplo bastante básico de como criar um processamento usando Thread em Delphi, isso resolve o problema pois passa a execução da consulta e montagem de arquivo para uma Thread separada da Thread principal do Form da tela. 1 - Primeiro crie uma nova classe para a Thread no Delphi, menu File -> New -> Other -> Thread Object para criar a Thread mas isso depende da versão do Delphi. O esqueleto gerado será basicamente o reproduzido abaixo:
| Bloco de código |
|---|
TWProcessamentoThread = | class protected procedure Execute; override;
protected
procedure Execute; override;
end; |
2 - O código gerado não sobrescreve o construtor padrão. Como teremos uma interação com o Form principal da aplicação, será preciso montar um construtor especial que aceite o nosso Form como parâmetro: constructor TWProcessamentoThread | Bloco de código |
|---|
var _Form: TForm;
constructor TWProcessamentoThread.Create(CreateSuspended: Boolean; AForm: TForm); |
inherited Create
inherited Create (CreateSuspended); |
FreeOnTerminate := false; |
A primeira linha do construtor chama o construtor Create da classe base (inherited) passando-lhe o parâmetro para indicar se a thread deve iniciar imediatamente ou permanecer suspensa. FreeOnTerminate é ajustado como false de modo que nós teremos que destruir instâncias da classe manualmente. 3 - A procedure Execute é onde deve ficar o código executado pela Thread. Aqui onde e criado a variável uFormPrincipal esta acessando o Form principal para obter os filtros inseridos pelo cliente, e nessa procedure será implementado o comportamento da Thread. TWProcessamentoThreadprocedureprocedure TWProcessamentoThread.Execute; |
var uFormPrincipal : TfrmPrincipal; |
uFormPrincipal Form As
// Implementação das consultas e geração de arquivos |
4 - No seu Form principal ao clique do botão Iniciar o processo crie uma instância da Thread para execução imediata e implemente um TTimer no Form principal com intervalo de um segundo ligando o Timer que checa o status da execução dela assim que instanciar a Thread: | Bloco de código |
|---|
var _Thread: ThreadProcesso; | TWProcessamentoThread TWProcessamentoThread.Create (false, | Self true
Na classe da Thread crie uma variável concluiuProcessamento do tipo boolean e passe ela para true no final do processamento. 5 - No evento do Timer do Form principal, verificamos se a Thread chegou ao fim da execução para fazer a limpeza:if | Bloco de código |
|---|
if (_Thread.concluiuProcessamento) | then
6 - Muito importante matar a Thread se o cliente fechar a rotina antes de concluir, para isso no Form principal no evento de saída FormDestroy implemente o trecho abaixo. | Bloco de código |
|---|
if TimerThread.Enabled then
_Thread.Terminate; |
7 - Para mais detalhes, verifique o projeto da rotina 2621 pois ela tem a implementação que fiz de Thread no Delphi que mostro nesse exemplo. end; |