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.