Thread Urgente
Por favor alguem me ajude !
Preciso colocar dois trecos de um programa rodando como se fossem thread !
Preciso colocar dois trecos de um programa rodando como se fossem thread !
Dicipulofer
Curtidas 0
Respostas
Cfn2003
07/05/2003
Poderia ser um pouco mais especifico...
GOSTEI 0
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
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
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;
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
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
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
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
Uma vez encontrado este comando o sistema ira esperar o tempo determinado ate executar outra vez
GOSTEI 0
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
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
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.
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