O que é uma Thread.
Um bom motivo para usarmos Thread é quando precisamos executar um ou vários processos relativamente pesados, porem não queremos que nossa aplicação fique bloqueada devido a execução dos mesmo. Para criarmos uma Thread devemos invocar o método CreateAnonymousThread o qual cria uma instância derivado de um TThread que simplesmente irá executar um método anônimo do tipo tproc passado como parâmetro na chamda do método. Quando invocamos o método CreateAnonymousThread a Thread vem com a Property FreeOnTerminate default True, o que faz com que a instancia da Thread seja destruída apos sua execução. Para manter a Thread criado set FreeOnTerminate = False, porem você deve destruir a instancia da Thread manualmente invocando o método Terminate; Vale lembrar que uma Thread é criada suspensa, para inicia-la você deve invocando o método Start().
Outra questão que devemos ter cuidado é quando necessitamos atualizar a tela, ou seja, manipular componentes visuais. Sempre que necessário devemos utilizar o método synchronize da Thread onde os processos executados dentro deste método são direcionados para a Thread principal executar, pois os objetos da VCL não podem ser diretamente atualizados em uma Thread que não seja a principal.
Agora que já entendemos a teoria, vamos para a melhor parte. Usaremos de exemplo 2 TProgressBar, onde vamos alimentar o Position ao mesmo tempo e veremos que nossa aplicação em momento algum vai "Travar".
No botão "Normal" alimentaremos as TProgressBar dentro de um de instrução FOR de forma normal.
Implementaremos também no botão mensagem, onde executamos o método ShowMessage apenas para demostrar que nossa aplicação não está travada quando executado pela Thread.
Após executarmos nossa aplicação podemos concluir que usando uma Thread nosso aplicativo não ficou travado, como mostra o vídeo abaixo.
Obrigado Ivan, fico feliz em ajudar.
ResponderExcluirPosso fazer um exemplo sem problemas. Me passe seu email e lhe envio, ou aguarde que postarei aqui.
Eduardo, no meu caso não está entrando na execução da thread, o que pode estar errado?
ExcluirMyThread := TThread.CreateAnonymousThread(procedure begin
AniIndicator1.Enabled := True;
AniIndicator1.Visible := True;
tthread.Synchronize(MyThread, procedure begin
sleep(3000);
end);
AniIndicator1.Enabled := False;
AniIndicator1.Visible := False;
end);
Esta faltando
ExcluirmyThread.start();
amigo, como que eu faço pra terminar uma thread anonima que ficou em loop e quando fecho o sistema me retorna memory leacs?
ResponderExcluirVocê deve sair deste loop para que a thread seja terminada, pó de criar uma variável para saber quando sair do loop.
ResponderExcluirObrigado amigo, então pelo que me parecw, é mais viável utilizar uma thread que esteja instanciada, ao invés de uma anônima
ExcluirOla amigo, uso delphi 2006 para uma aplicacao, e nao consigo usar a chamada TThread.CreateAnonymousThread. Ele nao reconhece. Tem alguma versao minima do delphi que tem esse recurso ?
ResponderExcluir