Treads no Delphi

Delphi

03/05/2003

estou desenvolvendo um sistema para analisar a disponibilidade de servidores na rede, para isso eu tenho de ficar fazendo testes com uma periodicidade relativamente alta. implementei isso normal no proprio programa, só q com esse processamento o sistema fica ´travado´ durante o rastreio impossibilitando atividades simultâneas ao mesmo.
por esse motivo estou vendo como colocar esses processos em treads separadas rodando em background. A ideia é linda, o unico problema é que eu não tenho a mínima ideia de como rodar isso em uma tread separada (background).
Se alguem souber como fazer isso. tiver uma apostila um link um nome pra mim procurar no HELP pelo menos :D com certeza será de grande valia.

[]´s


Sousa_thiago

Sousa_thiago

Curtidas 0

Respostas

Bhorn

Bhorn

03/05/2003

Se ainda estiver precisando me avisa que eu sei como fazer. Não estou respondendo agora porque você pode não mais precisar, mas se ainda precisar me avisa.


GOSTEI 0
Sousa_thiago

Sousa_thiago

03/05/2003

Ainda estou precisando sim cara ...

se vc puder me ajudar

[]s


GOSTEI 0
Bhorn

Bhorn

03/05/2003

Esse exemplo que eu vou te passar faz o seguinte: Tem um Label que fica sendo incrementado de um em um até X (20000 no meu exemplo) sem interrupção alguma, daí você altera conforme a sua necessidade.

Vou comentar todo o código faloWWW.

----------------------------
Essa é a Unit do Thread:
----------------------------

unit Unit2;

interface

uses
Classes, StdCtrls, SysUtils;

type
TContador = class(TThread)
private
FCaixa: TLabel;
{ Private declarations }
protected
procedure Execute; override;
procedure Incrementa;
procedure Soma;
public
constructor Create(Caixa: TLabel); // Só pra fazer Caixa ficar visível em todo o código
end;

implementation

{ TContador }

constructor TContador.Create(Caixa: TLabel);
begin
FCaixa := Caixa;
FreeOnTerminate := True;

inherited Create(False); // Esse parâmetro indica se a execução do Thread será suspensa logo ao criá-lo. Caso você queira criá-lo e iniciá-lo em outra outra use no formulário principal: Contador.Resume;
end;

procedure TContador.Execute;
begin
Incrementa; // Aqui você chama a procedure que ficará analisando a disponibilidade dos servidores
{ Place thread code here }
end;

procedure TContador.Incrementa;
Var
i: Integer;
begin
for i := 0 to 20000 do // No meu exemplo eu usei FOR mas você pode deixar aqui uma outra condição de parada (flag) ou até mesmo um laço infinito sem problemas
begin
Synchronize(Soma); // Aqui você chama a procedure que faz uma verificação de disponibilidade e o laço se encarregará de repetí-lo

if Terminated then
Exit;
end;
end;

procedure TContador.Soma;
begin
FCaixa.Caption := IntToStr(StrToInt(FCaixa.Caption) + 1);
end;

end.


-----------------------
Formulário Principal
-----------------------

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Unit2, Buttons, Mask;

type
TForm1 = class(TForm)
LblContador: TLabel;
BitBtn1: TBitBtn;
MaskEdit1: TMaskEdit;
BitBtn2: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
Contador: TContador;
begin
Contador := TContador.Create(LblContador);
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
Application.Minimize;
end;

end.


GOSTEI 0
POSTAR