'Trabalhando, por favor, aguarde' a tela com thread?
-
21-09-2019 - |
Pergunta
Talvez seja muito fácil para você, mas estou trabalhando duro em um projeto (para fins educacionais) que está consultando o ADSI com o componente TADSISEARCH, por vários dias. Estou tentando mostrar uma tela 'Aguarde', aguarde. Embora eu tenha tentado todas as possibilidades, mas não consegui ter sucesso. Tentei usar o TADSISEARCH em um thread, mas o thread está terminando antes do acabamento do AdSisSearch. Eu acho que o Tadsissearch não é seguro. O que você acha? Além disso, de outra maneira que eu criei o Form2 e usei um thread para atualizá -lo, mas o GIF animado está parando enquanto o formulário principal foi pesquisando adsi. O que você pode dizer sobre isso? Como posso fazer uma tela, por favor, aguarde enquanto o AdsiseSearch está funcionando e manter o formulário principal respondendo. Application.processmessages ou Timer também não é uma maneira. Muito obrigado pela leitura e respostas.
Solução
A interface gráfica do usuário deve ser atualizada pelo thread principal. Você deve colocar seu código de pesquisa em um encadeamento separado e, enquanto o thread do pesquisador estiver funcionando, seu thread principal pode mostrar a animação junto com a mensagem "Por favor, aguarde".
Seu thread do pesquisador pode notificar o thread principal quando a pesquisa é feita por qualquer uma das técnicas de sincronização disponíveis. O mais simples é definir um método na sua classe de thread que interrompe a animação na interface do usuário e passe esse método para sincronizar no final do método executado do seu thread do pesquisador.
Seu código de thread do pesquisador será algo assim:
type
TMyThread = class(TThread)
private
procedure NotifyEndOfThread;
protected
procedure Execute; override;
end;
implementation
uses MainFormUnit;
procedure TMyThread.NotifyEndOfThread;
begin
MainForm.ShowAnimation := False;
end;
procedure TMyThread.Execute;
begin
try
{Add your search code here}
finally
Synchronize(NotifyEndOfThread);
end;
end;
E o código do seu tópico principal será assim:
TMainForm = class(TForm)
...
private
FShowAnimation : Boolean;
procedure SetShowAnimation(Value: Boolean);
public
property ShowAnimation : Boolean read FShowAnimation write SetShowAnimation;
end;
procedure TMainForm.SetShowAnimation(Value: Boolean);
begin
FShowAnimation := Value;
if FShowAnimation then
{Add animation code here}
else
{Stop animation}
end;
Outras dicas
Talvez você possa tentar isso:
Tela splash de rosca para Delphi
http://cc.embarcadero.com/item/20139
Eu uso isso em um aplicativo de tela sensível ao toque/terminal (Thin Client, Wi -Fi, Remobjects etc.) e funciona bem! Também consegui um GIF animado funcionando.
Como o thread pode terminar antes que a pesquisa seja concluída? Se a pesquisa for executada no thread e você tiver apenas uma instância do thread, ele deve funcionar.
Você não pode apenas fazer um
f := TMyWaitForm.Create(self);
try
f.Show();
...start the TADSISearch...
finally
FreeAndNil(f);
end;
Colocando um GIF animado no TMYWaitForm (que se exibe)?
Eu tenho uma forma de progresso ao criar sites no meu programa de criação da web, e isso funciona como um charme.
Você pode considerar mostrar algumas informações de estado sobre o formulário de espera (se o componente/software TADSISEARCH tiver uma função ou evento de chamada que possa ser atribuído).
Exibir um relógio em execução mostrando a quantidade de tempo que o processo está levando, também é um toque agradável.