Fórum Não travar animação igual o TAnimate #348413
05/11/2007
0
Alguém sabe como fazer uma animação por exemplo, em gif, que não congele em um processamento?
Quando coloco um TAnimate e o ativo, ele não congela a animação. Como é feito? Alguém sabe?
Tentei com o JvBmpAnimator da biblioteca Jedi, que é exatamente o que eu preciso, mas o problema é que ele congela a animação quando inicio algum processo.
Fico aguardando uma dica!
Obrigado desde já!
Tchelllo
Curtir tópico
+ 0Posts
05/11/2007
Alexandrej
Se esse processo for por exemplo, um while, você pode tentar colocar um Application.ProcessMessages dentro do looping.
Gostei + 0
05/11/2007
Tchelllo
Este processo não é um loop. Trabalho com 3 camadas. O que eu faço é disparar um método no servidor a partir da app. cliente. Nesse momento o programa fica congelado até que o método seja finalizado.
Por isso o uso do Application.ProcessMessages não tem como ser executado.
Gostei + 0
05/11/2007
Massuda
Gostei + 0
05/11/2007
Tchelllo
Gostei + 0
05/11/2007
Alexandrej
Então uma thread é o ideal mesmo.
Gostei + 0
05/11/2007
Tchelllo
Quando usamos thread, não podemos fazer desta forma, ex:
procedure Button1Click(Sender: TObject);
var i: integer;
s: string;
begin
IniciaThread;
for i := 0 to 2000000 do
s := IntToStr(i);
end;
No caso a thread fica congelada do mesmo jeito. O correto é da forma abaixo:
procedure Button1Click(Sender: TObject);
begin
IniciaThread;
IniciaLoop;
end;
Nos 2 casos, a thread não era pra ser executada tbm? O que estou fazendo de errado?
Gostei + 0
05/11/2007
Alexandrej
Você deve criar uma thread passando algum objeto como parâmetro para receber o resultado do processamento. A noite se precisar posso explicar melhor, durante o dia é complicado. :(
Mas existem bastante exemplos no google, digite na busca: delphi + thread + definitivo.
Gostei + 0
05/11/2007
Tchelllo
como no exemplo que dei:
procedure Button1Click(Sender: TObject);
var i: integer;
s: string;
begin
IniciaThread;
for i := 0 to 2000000 do
s := IntToStr(i);
end;
Se fizer assim a thread fica congelada tbm. Não era pra ficar executando?
Gostei + 0
05/11/2007
Massuda
Gostei + 0
05/11/2007
Tchelllo
IniciaThread é apenas um exemplo indicando que alí eu estou iniciando uma thread (MinhaThread.Create(False))
O que eu quero exatamente é o seguinte: Mostrar uma tela de espera com animação enquanto executo um método no servidor. A animação é pra mostrar que o programa não está travado.
O correto é eu colocar a chamada ao método na minha thread? E o código que cria a tela de espera com animação? Na Thread tbm ou em uma outra?
Gostei + 0
05/11/2007
Massuda
const WM_MINHA_THREAD_ACABOU = WM_USER + 1; type TMeuFormPrincipal = class(TForm) procedure Button1Click(Sender: TObject); private procedure WMMinhaThreadAcabou(var Msg: TMessage); message WM_MINHA_THREAD_ACABOU; ... end; TMinhaThread = class(TThread) protected procedure Execute; override; ... end; ... procedure TMinhaThread.Execute; begin FreeOnTerminate := True; try // faz algo demorado aqui except // trata eventuais exceções end; // avisa a UI que terminou PostMessage(Application.MainForm.Handle, WM_MINHA_THREAD_ACABOU, 0, 0); end; ... procedure TMeuFormPrincipal.Button1Click(Sender: TObject); begin // inicia a animação, desabilita o botão, etc // inicia a thread TMinhaThread.Create(False); end; procedure TMeuFormPrincipalWMMinhaThreadAcabou(var Msg: TMessage); begin // pára a animação, habilita o botão, etc end;
Gostei + 0
05/11/2007
Tchelllo
Teria uma forma mais fácil e rápida de fazer isso ao invés de criar uma thread pra cada método?
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)