Buscar

Construindo threads com delphi

Código

Hoje em dia, os programas de computador devem ser cada vez mais rápidos de serem executados e que possam realizar várias tarefas ao mesmo tempo, para que o usuário possa realizar outras operações, ao mesmo tempo que as executa.

Mas para que isso aconteça, nós desenvolvedores de software devemos escrever nossos programas baseados nesta tecnologia de muitas linhas de execução, ou simplesmente "Threads".

Um thread pode realizar vários operações residindo num memso espaço de endereço na memória, quem realmente controla esses threads é o sistema operacional, que se baseia em suas prioridades. Essas proridades são setadas por nós quando desenvolvemos um thread. A boa nova, é que o Delphi é compatível com esta tecnologia e fico triste quando vejo muitas pessoas que ainda se empolgam muito pelo fato do Delphi ser visual e fácil de usar, e esquecem de seu enorme potencial.

Eu resolvi mostrar como se faz um thread, pois, é de suma responsabilidade de um programador que uma aplicação fique estável, e não devemos, num projeto grande, nos basear somente na arquitetura de Orientação a Objeto e IDE aprimorado do Delphi para Desenvolver software.

Para se criar um thread em Delphi, devemos criar uma classe que derive da classe "TThread", que está escrita na biblioteca "Classes". A classe TThread é uma classe abstrata, portanto não podemos utilizá-la diretamente, pois devemos implementar um de seus métodos. Esse método se chama "Execute", ele é responsável por todo o funcionamento do seu Thread. Junto com esse método, temos o outro método "Synchronize" que serve para acessar partes da VCL sem que percamos o controle da aplicação, ou seja, o Windows ainda possa controlar nossos objetos enviando mensagens para eles. Esse método tem um único argumento que é do tipo procedimento, ou seja, temos que definir procedimentos em nossa classe que controlem a VCL, e quando quisermos chamá-los, devemos passá-los como argumento do método Synchronize. O nosso thread fará o seguinte: Ele irá contar quantas linhas um arquivo texto possui, e a cada linha que ele ler, irá incrementar uma label que estará num form. A classe ficará assim:


--------------------------------------------------------------------------------

type
  TContador = class(TThread)
  private
  FNomeArq: string;
  FNLinhas: Longint;
  protected
  procedure Execute; override; // Método anulado
  procedure IncLabel; virtual;
  public
  constructor Create(const Arquivo: string);
end;
 
implementation
 
procedure TContador.Execute;
var
  Arq: TextFile;
  S: string;
begin
  try
  AssignFile(Arq, FNomeArq);
  Reset(Arq);
  while (not SeekEof(Arq)) do
  begin
  ReadLn(Arq, S);
  FNLinhas := FNLinhas + 1;
  Synchronize(IncLabel); // Aqui é chamado o contador...
  end;
  finally
  CloseFile(Arq);
  end;
end;
 
procedure TContador.IncLabel;
begin
  Form1.Label1.Caption := IntToStr(FNLinhas);
  { o Contador será executado em modo protegido por uma Seção Critica do Windows}
end;
 
constructor TContador.Create(const Arquivo: string);
begin
  inherited Create(True); { Chama o contrutor herdado. Ele irá temporariamente colocar o thread em estado de espera para depois executá-lo. }
  FNomeArq := Arquivo;
  FreeOnTerminate := True; // Libera o objeto após terminar.
  Priority := TpLower; { Configura sua prioridade na lista de processos do Sistema operacional. }
  Resume; // Inicia o Thread.
end;

--------------------------------------------------------------------------------

para construir este exemplo, inicie uma nova aplicação, coloque um "Edit" e uma "Label" no Form. Inclua um botão também que quando pressionado irá contar as linhas do arquivo que estiver no Edit. Escreva a classe acima numa unit separada e no código do botão faça assim:

procedure TForm1.Button1Click(Sender: TObject);
var
  Cont: TContador;
begin
  Cont := TContador.Create(Edit1.Text);
end;
Com esse código simples, podemos calcular quantas linhas estiverem no arquivo do Edit. Para testar digite no Edit o arquivo "C:Frunlog.txt".

Espero que vocês gostem da surpresa, e dada a facilidade enorme de se criar um thread em Delphi, aconselho a vocês a utilizarem threads mais frequentemente nos seus aplicativos. Mas não em excesso e sejam cautelosos configurando as prioridades dos Threads.

 

Publicidade

Vote na dica




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes da dica

Categoria: Forms
Adicionada dia: 28/12/06
Por: Denilson Santos
Visualizada: 34454 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009