Thread Urgente

Delphi

07/05/2003

Por favor alguem me ajude !
Preciso colocar dois trecos de um programa rodando como se fossem thread !


Dicipulofer

Dicipulofer

Curtidas 0

Respostas

Cfn2003

Cfn2003

07/05/2003

Poderia ser um pouco mais especifico...


GOSTEI 0
Dicipulofer

Dicipulofer

07/05/2003

eh os seguinte eu tenho uma funcao que eh chamada dentro de um objeto timer.

Ou seja toda hora que der um certo tempo a funcao eh chamada.

Soh que esta minha funcao eh muito pesada. e equanto ela esta executando o meu programa nao responde ate seu termino.

O que eu queria fazer eh executar esta funcao um pedaco e liberar o sistema, apos isso executar outro pedaco e liberar o sistema.

Acho que usando threads da certo.

ai eu coloco minha funcao como uma thread. e o resto do prg em outr thread


GOSTEI 0
Cfn2003

Cfn2003

07/05/2003

Da uma olhada no codigo abaixo, meu sistema faz a mesma coisa , so que executa uma sp de mais de 20 M de registros enquanto isto a tela fica atualizando.

O caminho e este, qq estamos ai

Lembrando , o que vc quiser que a thread execute vc deve colocar no thread.EXECUTE


type
TFCalculo = class(TThread)
protected
procedure execute; override;
end;
Type
Mostra = class(tthread)
private
txt : string;
i : integer;
procedure atualizar();
protected
procedure Execute;override;

public
{ Public declarations }
te : boolean;
end;


var
fcalc: Tfcalc;

implementation

uses ffmenu, ffcompras, ffbasedados, ffselecaodata, ffconnect, ffmoving,
ffparalelo,ffconfig,


ffprocess, ffaguardesp;

{$R *.dfm}

{**************************************************************************************************************************
/Inicio das procedures de calculo do sistema}


procedure tfcalc.proces;
begin
with q1 do
begin
active := false;
close;
parameters[0].Value := copy(datetimetostr(DateTimePicker1.Date),1,10);
open;
active := true
end;
end;


procedure tfcalculo.execute();
begin
FreeOnTerminate:=true;
with tadoquery.Create(nil)do
try
connection := fconnect.con;
commandtimeout := 28800;
sql.add(fcalc.strg);
try
fcalc.te := true;
execsql;
except
messagedlg(´Impossível realizar comando! Reinicialize o comando´,mterror,[mbok],0);
end;
finally
free;
fcalc.te := false;
tfcalculo.Create(true);
fcalc.proces;
faguardesp.Close;
end;
exit;
end;

procedure mostra.atualizar();
begin
faguardesp.Label1.Caption := txt;
if faguardesp.Label2.Font.Color = clred then
begin
faguardesp.Label2.Font.Color := clnavy;
end
else if faguardesp.Label2.Font.Color = clnavy then
begin
faguardesp.Label2.Font.Color := clred;
end;
faguardesp.Refresh;
end;

procedure mostra.Execute;
begin
FreeOnTerminate:=true;

faguardesp.BringToFront;
sleep(10);
while fcalc.te = true do
begin
faguardesp.Show;
txt := txt + ´.´;
sleep(500);
Synchronize(Atualizar);
inc(i);
if txt = ´..........´ then
begin
txt := ´´;
end
end;
mostra.Create(true);
exit;
end;

procedure tfcalc.executaSP(strge : string);
begin
strg := strge;
tfcalculo.Create(false);
mostra.Create(false);
end;


GOSTEI 0
Dicipulofer

Dicipulofer

07/05/2003

Muito obrigado pela atencao.
So uma duivda.. eu queria que a prioridade de minha funcao refresh seja por exemplo 30 ¬ e a funcao do prg inteiro 70 ¬ tem como ?

ex:

colocar isto em uma thread com 70 ¬
func principal
begin
fjfjf
fjfjf
fjf
end;



// *** colocar isto em uma thread com 30 ¬
function atualiza
begin
while j < 10 // se nao tiver em threah trava
ff
end


GOSTEI 0
Cfn2003

Cfn2003

07/05/2003

Use o sleep, para obter um intervalo entre uma execucao e outra, o tempo e em ms.
Uma vez encontrado este comando o sistema ira esperar o tempo determinado ate executar outra vez


GOSTEI 0
Dicipulofer

Dicipulofer

07/05/2003

boa ideia do sleep.. nao havia pensado nisso.

type
TFCalculo = class(TThread)
protected
procedure execute; override;
end;
Type
Mostra = class(tthread)
private
txt : string;
i : integer;
procedure atualizar();
protected
procedure Execute;override;

public
{ Public declarations }
te : boolean;
end;


so uma duvida quando voce cria essas classes acima.

Voce criou duas classes uma mostra e a outra tfcalculo
A sintaxe acima esta correta ?
uso delphi 6 nao esta conseguindo compilar


GOSTEI 0
Cfn2003

Cfn2003

07/05/2003

O codigo que eu te passei e de um programa em Delphi 6 que esta rodandado normamelte.
Eu criei duas classes threads para evitar que o sleep da mostra interfira na execucao do calculo, pois se vc colocar um sleep dentro da classe , esta ficara toda dependendo do sleep.


GOSTEI 0
POSTAR