A classe TThread é uma classe abstrata, não podendo ser utilizada diretamente e sim através de uma subclasse dela. Temos, assim, a necessidade de derivar uma nova classe, tendo como classe base a classe TThread e, então, implementar o método Execute.
Vamos por isso em prática:
1. Selecione o menu File | New | Other;
2. Selecione Thread Object na guia New conforme a figura abaixo:
3. Será então exibida uma nova janela New Thread Object, onde deve ser digitado o nome da classe que representa nosso novo processo. Se você estiver usando o Delphi 7 será exibida uma janela igual a seguinte, onde deve ser preenchido apenas o campo Class Name, caso esteja utilizando uma versão anterior será exibida alguma janela semelhante:
4. Será então gerada um esqueleto com a unidade da nossa nova classe.
A definição do método Execute é tão importante que foi gerada automaticamente, assim como também um comentário que o ajuda a implementar o método, comentário este que, evidentemente, pode ser retirado sem nenhum problema.
Este comentário ainda nos informa que alterações de propriedades e chamadas de métodos aos componentes da VCL (Visual Component Library), somente podem ser feitas mediante o método Synchronize. Sendo assim qualquer método que altere uma propriedade de um objeto da VCL deve ser chamado passando seu nome como parâmetro do método Synchronize da nova classe.
Vejamos a seguir como ficam as unidades prontas com seus respectivos comandos:
Unidade do Formulário
Veja a seguir o resultado final:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;type
TForm1 = class(TForm)
ProgressBar1: TProgressBar;
ProgressBar2: TProgressBar;
ProgressBar3: TProgressBar;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure AdcionarProgresso(Barra: TProgressBar);
begin
while Barra.Position < Barra.Max do
Barra.StepBy(1);
end;procedure TForm1.Button1Click(Sender: TObject);
begin
ProgressBar1.Position := 0;
ProgressBar2.Position := 0;
ProgressBar3.Position := 0;
AdcionarProgresso(ProgressBar1);
AdcionarProgresso(ProgressBar2);
AdcionarProgresso(ProgressBar3);
end;procedure TForm1.Button2Click(Sender: TObject);
var Barra1, Barra2, Barra3: TMeuThread;
begin
ProgressBar1.Position := 0;
ProgressBar2.Position := 0;
ProgressBar3.Position := 0;
Barra1 := TMeuThread.Criar(ProgressBar1);
Barra2 := TMeuThread.Criar(ProgressBar2);
Barra3 := TMeuThread.Criar(ProgressBar3);
end;end.Unidade do Threadunit Unit2;interfaceuses
Classes, ComCtrls;type
TMeuThread = class(TThread)
private
BarraProgresso: TProgressBar;
protected
procedure Execute; override;
procedure Incrementa;
public
constructor Criar(Barra: TProgressBar);
end;implementationconstructor TMeuThread.Criar(Barra: TProgressBar);
begin
Create(False);
BarraProgresso := Barra;
FreeOnTerminate := True;
end;procedure TMeuThread.Execute;
begin
while BarraProgresso.Position < BarraProgresso.Max do
Synchronize(Incrementa);
end;procedure TMeuThread.Incrementa;
begin
BarraProgresso.StepBy(1);
end;end.
[ Fonte ]
0 comentários:
Postar um comentário