quinta-feira, 27 de março de 2014

Thread,Delphi. (Anonymous Thread)

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.

Já no botão Thread implementamos o mesmo código executado no botão normal, porem quem processa é a nossa Thread.


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.











7 comentários:

  1. Obrigado Ivan, fico feliz em ajudar.
    Posso fazer um exemplo sem problemas. Me passe seu email e lhe envio, ou aguarde que postarei aqui.

    ResponderExcluir
    Respostas
    1. Eduardo, no meu caso não está entrando na execução da thread, o que pode estar errado?

      MyThread := 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);

      Excluir
    2. Esta faltando
      myThread.start();

      Excluir
  2. amigo, como que eu faço pra terminar uma thread anonima que ficou em loop e quando fecho o sistema me retorna memory leacs?

    ResponderExcluir
  3. Você deve sair deste loop para que a thread seja terminada, pó de criar uma variável para saber quando sair do loop.

    ResponderExcluir
    Respostas
    1. Obrigado amigo, então pelo que me parecw, é mais viável utilizar uma thread que esteja instanciada, ao invés de uma anônima

      Excluir
  4. Ola 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