Thread - Que negócio doido!!!!
Pessoal,
eu estou fazendo um sistema que chama outro programa e insere dados nele. Como toda vez que eu chamava o outro programa e o meu sistema fazia os loops da vida, meu formulário ficava lento e eu nao conseguia mexe-lo. dai eu pensei: irei usar thread para enquanto eu estiver fazendo os loops e processando as tarefas, eu possa mexer no meu formulário principal.
Dai eu criei minha classe de Thread...mas mesmo assim eu continuo sem conseguir mexer no formulário principal..eu nao consigo nem move-lo..fazer nada, pois os processos estao sendo executados...mesmo com a thread criada.
Segue a thread:
TRecuperacao = class(TThread)
private
[b:ee23ebd7b2]procedure RecuperarREs;[/b:ee23ebd7b2]
protected
[b:ee23ebd7b2]procedure Execute; override;[/b:ee23ebd7b2]
public
[b:ee23ebd7b2] dataInicial, dataFinal: String;
constructor Criar(dataInicial, dataFinal: String);[/b:ee23ebd7b2]
end;
Dai para chamar a thread, eu fiz o seguinte no construtor(Criar):
constructor TRecuperacao.Criar(dataInicial, dataFinal: String);
begin
[b:ee23ebd7b2]self.dataInicial := dataInicial;
self.dataFinal := dataFinal;
Create(False);
FreeOnTerminate := true;[/b:ee23ebd7b2]
end;
no meu execute da Thread, eu chamo a procedure chamada RecuperarREs que irá instanciar objetos, fazer loops, e interagir com outro form:
procedure TRecuperacao.Execute;
begin
[b:ee23ebd7b2] Synchronize(RecuperarRes);[/b:ee23ebd7b2]
end;
procedure TRecuperacao.RecuperarRes;
var
I: Integer;
[b:ee23ebd7b2]begin
for I:=0 to 1000000 do
begin
_frmPrincipal.caption := InttoStr(I);
end;[/b:ee23ebd7b2]
end;
Dai eu pensei o seguinte: vou tentar colocar tudo dentro do execute! e dai deu certo!!
E nao to usando syncronize nem nada..ou seja, ficou assim:
procedure TRecuperacao.Execute;
var
I: Integer;
begin
[b:ee23ebd7b2] for I:=0 to 1000000 do
begin
_frmPrincipal.caption := InttoStr(I);
end;[/b:ee23ebd7b2]
end;
Isso ta dando certo! e estou consetguindo mover meu formulário principal e fazer outras tarefas...
alguém pode me explicar isso? to fazendo algo de errado?
Estou tirando essa duvida pois tenho medo de mais para frente eu ter problemas com meu sistema.
Obrigado.
eu estou fazendo um sistema que chama outro programa e insere dados nele. Como toda vez que eu chamava o outro programa e o meu sistema fazia os loops da vida, meu formulário ficava lento e eu nao conseguia mexe-lo. dai eu pensei: irei usar thread para enquanto eu estiver fazendo os loops e processando as tarefas, eu possa mexer no meu formulário principal.
Dai eu criei minha classe de Thread...mas mesmo assim eu continuo sem conseguir mexer no formulário principal..eu nao consigo nem move-lo..fazer nada, pois os processos estao sendo executados...mesmo com a thread criada.
Segue a thread:
TRecuperacao = class(TThread)
private
[b:ee23ebd7b2]procedure RecuperarREs;[/b:ee23ebd7b2]
protected
[b:ee23ebd7b2]procedure Execute; override;[/b:ee23ebd7b2]
public
[b:ee23ebd7b2] dataInicial, dataFinal: String;
constructor Criar(dataInicial, dataFinal: String);[/b:ee23ebd7b2]
end;
Dai para chamar a thread, eu fiz o seguinte no construtor(Criar):
constructor TRecuperacao.Criar(dataInicial, dataFinal: String);
begin
[b:ee23ebd7b2]self.dataInicial := dataInicial;
self.dataFinal := dataFinal;
Create(False);
FreeOnTerminate := true;[/b:ee23ebd7b2]
end;
no meu execute da Thread, eu chamo a procedure chamada RecuperarREs que irá instanciar objetos, fazer loops, e interagir com outro form:
procedure TRecuperacao.Execute;
begin
[b:ee23ebd7b2] Synchronize(RecuperarRes);[/b:ee23ebd7b2]
end;
procedure TRecuperacao.RecuperarRes;
var
I: Integer;
[b:ee23ebd7b2]begin
for I:=0 to 1000000 do
begin
_frmPrincipal.caption := InttoStr(I);
end;[/b:ee23ebd7b2]
end;
Dai eu pensei o seguinte: vou tentar colocar tudo dentro do execute! e dai deu certo!!
E nao to usando syncronize nem nada..ou seja, ficou assim:
procedure TRecuperacao.Execute;
var
I: Integer;
begin
[b:ee23ebd7b2] for I:=0 to 1000000 do
begin
_frmPrincipal.caption := InttoStr(I);
end;[/b:ee23ebd7b2]
end;
Isso ta dando certo! e estou consetguindo mover meu formulário principal e fazer outras tarefas...
alguém pode me explicar isso? to fazendo algo de errado?
Estou tirando essa duvida pois tenho medo de mais para frente eu ter problemas com meu sistema.
Obrigado.
[vaza]
Curtidas 0
Respostas
[vaza]
16/04/2009
[color=´#FF0000´][b:ac2ff0e37c]Obs.:[/b:ac2ff0e37c][/color] [i:ac2ff0e37c]Na realidade, eu estou apenas resumindo a procedure RecuperarRes. dentro dela eu estou criando objetos de outros classes, fazendo alguns loops em uma stringgrid do form principal, etc.[/i:ac2ff0e37c]
GOSTEI 0
Wdrocha
16/04/2009
As vezes isso tbm acontece comigo.....
e outras vezes não....mas eu nunca tive problemas....
ma seria legal alguém dizer se tem ou não algum erro, pois pod ser o meu erro tbm...
flw
e outras vezes não....mas eu nunca tive problemas....
ma seria legal alguém dizer se tem ou não algum erro, pois pod ser o meu erro tbm...
flw
GOSTEI 0
Rudá
16/04/2009
Amigo,
Quando vc da um Synchronize é para mandar as informações para thread principal executar e com isso o programa fica travado.
Ele serve quando vc for interagir com a thread principal.
Vamos dizer que vc queria fazer um processo que fica em segundo plano, que acessa dados faz um bocado de coisa e depois exibe um simples resultado.
Nesse caso vc vai colocar tudo no Execute depois quando for exibir a mensagem vc usa o Synchronize(ExibirMensagem).
Quando vc da um Synchronize é para mandar as informações para thread principal executar e com isso o programa fica travado.
Ele serve quando vc for interagir com a thread principal.
Vamos dizer que vc queria fazer um processo que fica em segundo plano, que acessa dados faz um bocado de coisa e depois exibe um simples resultado.
Nesse caso vc vai colocar tudo no Execute depois quando for exibir a mensagem vc usa o Synchronize(ExibirMensagem).
GOSTEI 0
[vaza]
16/04/2009
Amigo,
Quando vc da um Synchronize é para mandar as informações para thread principal executar e com isso o programa fica travado.
Ele serve quando vc for interagir com a thread principal.
Vamos dizer que vc queria fazer um processo que fica em segundo plano, que acessa dados faz um bocado de coisa e depois exibe um simples resultado.
Nesse caso vc vai colocar tudo no Execute depois quando for exibir a mensagem vc usa o Synchronize(ExibirMensagem).
A Thread principal que vc esta querendo dizer é o meu Projeto(formulario) por exemplo?
Na realidade, mesmo dentro do execute, eu estou enviando dados para o formulário principal, como mensagens no Tray Icon...
[b:4a02173e30]Para ver se eu entendi:[/b:4a02173e30]
Caso eu quisesse inserir um Timer dentro da minha nova Thread e todo segundo mostrasse a hora no form principal...dai nesse caso eu usaria o synchronize? Se nao o resultado no form principal iria travar?
GOSTEI 0
Rudá
16/04/2009
Exato.
Vc não iria usar um timer, mas iria dentro do execute:
while Not Terminated do
begin
sleep(1000);
synchronize(AtualizarHora);
end
A cada 1 segundo ele vai executar o atualizar hora.
Esse seria o certo. agora para vc visualizar faça o errado tb:
dentro do execute coloque:
while Not Terminated do
synchronize(AtualizarHora);
e dentro do AtualizarHora coloque o sleep e depois o que deseja fazer.
Nesse caso vai ficar travada a aplicação.
Vc não iria usar um timer, mas iria dentro do execute:
while Not Terminated do
begin
sleep(1000);
synchronize(AtualizarHora);
end
A cada 1 segundo ele vai executar o atualizar hora.
Esse seria o certo. agora para vc visualizar faça o errado tb:
dentro do execute coloque:
while Not Terminated do
synchronize(AtualizarHora);
e dentro do AtualizarHora coloque o sleep e depois o que deseja fazer.
Nesse caso vai ficar travada a aplicação.
GOSTEI 0