Criar Thread no Delphi


Uma Thread e utilizada para executar um ou vários processos relativamente pesados, porem não queremos que nossa aplicação fique bloqueada ( Envio de e-mail, Backup, compactação de arquivos etc..) 
Em versões mais antigas necessariamente tínhamos que ter uma criação de uma Thread, muitas vezes com a necessidade de criação de uma nova Unit.

Exemplo:
TMinhaThread = class(TThread)
private
protected
  procedure Execute; override;
public
  constructor Create();
end;

constructor TMinhaThread.Create();
begin
  inherited Create(True);
  FreeOnTerminate := True; { Libera da memoria }.
  Priority := TpLower; Prioridade na lista }
  Resume; { Inicia }.
end;

procedure TMinhaThread.Execute;
begin
  inherited;
  {Processo a ser executado}
end;

{ Criação da Thread em outra tela }
procedure TSistema.Button1Click(Sender: TObject);
var
  lThread : TMinhaThread;
begin
  lThread := TMinhaThread.Create;
  lThread.Execute;
end;

Em novas versões (XE) temos o método CreateAnonymousThread nativo não necessariamente precisando criar. E ainda o FreeOnTerminate por default é True com isto não precisa fazer a destruição da instancia no fim do processo.

Então vamos para o exemplo:


Vamos colocar dois botões para em uma fazer o exemplo com a criação da TThread e o outro sem a necessidade de criação, lembrando de de ambos os modos não se precisa fazer a destruição do método

Em nosso exemplo vamos compactar um arquivo selecionado, abaixo um exemplo simples de compactação agora vamos na criação das TThread 
procedure TFSistema.CompactarArquivos;
var
  lZipFile: TZipFile;
begin
  lZipFile := TZipFile.Create;
  try
    lZipFile.Open(TPath.Combine(GetCurrentDir, 'ArquivoNovo.zip'), zmWrite);
    lZipFile.Add(OpenDialog.FileName);
    MessageDlg('Compactação concluída "ArquivoNovo"!', mtInformation, [mbOK], 0);
  finally
    lZipFile.Free;
  end;
end;

Primeiro exemplo: Note que em poucas linhas fazemos a criação e jogamos o CompactarArquivos sem dificuldade para dentro da TThread.
procedure TFSistema.BtnCompactarCriacaoClick(Sender: TObject);
var
  lThread : TThread;
begin
  lThread := TThread.CreateAnonymousThread(CompactarArquivos);
  lThread.Start();
end;

Segundo exemplo: Neste exemplo em uma unica linha fizemos a Thread sem a necessidade de criação da variável e novamente sem precisar liberar da memoria.
procedure TFSistema.BtnCompactarCriacaoClick(Sender: TObject);
begin
  TThread.CreateAnonymousThread(CompactarArquivos).Start;
end;

Exemplo: Download do exemplo

0 comentários:

Postar um comentário