|
Usuários |
|
120 Usuários Online
|
|
[Artigos]
Threads no Delphi, por onde começar ? – Parte V |
Publicado por rboaro : Terça, Fevereiro 26, 2013 - 08:08 GMT-3 (724 leituras)
9 Comentários Enviar para um amigo Versão para impressão
|
Chegamos ao final desse estudo introdutório sobre o fantástico mundo do processamento concorrente, proporcionado pelo uso das threads. Nessa quinta e última parte, veremos algumas dicas sobre como não enlouquecer ao realizar debugging em um ambiente multi thread. Você pode até perguntar “mas qual é o real problema do debbuing em um ambiente multi thread?”. Imagine a seguinte situação, você possui uma thread que está em execução contínua (monitorando um diretório por exemplo), enquanto esta thread é executada, você inicia a depuração de outra rotina qualquer executada pela main thread. De repente, sem a menor explicação, o ponteiro do seu debug vai para outra rotina em outra unit sem a menor relação com a depuração que você estava fazendo. Quando você consegue se dar conta do que aconteceu, percebe que o ponteiro da depuração foi movido para o processamento da thread. Quem está familiarizado com um ambiente multi thread conhece bem esse tipo de história.
Para começar, vamos conhecer a janela Thread Status (View -> Debug Windows -> Threads ou Ctrl + Alt + T)
 Essa janela mostra todas as threads da aplicação, assim como seu estado, status, etc. Por padrão, ao entrar em modo de debugging o próprio Delphi já abre esta janela no rodapé da tela. Esta imagem foi capturada de uma aplicação onde, além da main thread, eu tinha mais 3 threads em execução. Ainda assim, mesmo com a janela thread status aberta, não ajuda muito, pois não sei qual thread é qual. Para resolver esse problema, podemos identificar as threads em debugging através do método NameThreadForDebugging() da classe TThread. Esse método pode ser utilizado no execute da thread:
procedure TArquivoTextoInThread.Execute;
begin
Self.NameThreadForDebugging(Format('arquivo txt %d',[self.FLinhasAImprimir]));
Self.escreverArquivoDeTexto();
end;
Inclusive é possível nomear a main thread, basta utilizar um cast com a classe TThread. Por exemplo:
procedure TfrmPrincipal.FormCreate(Sender: TObject);
begin
TThread(Self).NameThreadForDebugging('main thread');
end;
Com as threads devidamente nomeadas, a janela threads status passa a ficar muito mais clara:

Caso você consiga identificar uma thread pelo id, você pode alterar seu nome para debugging na janela thread status basta clicar com o botão direito do mouse sobre a linha da thread e depois selecionar a opção name thread.
Agora, imagine que você queira depurar uma determinada thread, mas não quer que a execução de outra thread qualquer possa interferir nesse processo. Em uma situação destas você pode parar a execução de uma ou todas as threads. Quando a aplicação tem a sua execução pausada (caindo em um breakpoint ou caso o botão de pause seja clicado), você pode clicar com o botão direito do mouse sobre a thread que deseja pausar a execução e selecionar a opção Freeze, ou pode clicar com o botão direito do mouse sobre a única thread que você deseja que continue executando e se selecionar a opção Freeze All Other Threads.

Veja que estou com o ponteiro de depuração em um breakpoint de uma thread (status Breakpoint) e parei a execução de outra thread (status Frozen). Caso eu passe a depurar a thread (com o F8 ou F7 por exemplo) o status mudaria de Breakpoint para Stepped. Para liberar a execução da thread congelada (Frozen), basta clicar nela e selecionar a opção Thaw.
Por falar em breakpoints, você pode condicionar um breakpoint para que ele funcione somente quando aquele trecho de código seja executado por uma determinada thread. Para realizar essa configuração, clique com o botão direito do mouse sobre o breakpoint e selecione a opção Breakpoint Properties, uma das propriedades é exatamente a thread:

Isso garante que o breakpoint só será acionado, caso a thread corrente seja a thread configurada.
Espero que tenha ajudando um pouco com essas dicas, apesar de threads não serem nenhuma novidade, vejo que muitas vezes é um assunto que não recebe o seu devido valor. Obviamente o assunto não se encerra aqui, até mesmo porque esse estudo recebeu o nome de Threads no Delphi, por onde começar? Sendo assim, isso é só o começo.
|
|
Comentários | |
| | Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos. |
por: carlos_tedex (carlos.tedex@gmail.com)
: Mar 04, 2013 - 01:52 (Informações sobre o membro | Enviar uma mensagem)
http://http://
|
Meus parabéns pelo artigo. Agora não posso falar que não conheço TThread.
Só uma pergunta, fiz um teste no Delphi 2010 e percebi que o mesmo não reconheceu o "TThread.CreateAnonymousThread" gostaria de saber a partir de qual versão do Delphi sofreu essa implementação?
Caso você também possa disponibilizar ou me enviar um e-mail com os fontes utilizados neste artigo ficarei grato.
|
por: drgarcia1986 (drgarcia1986@gmail.com) : Mar 04, 2013 - 02:21 (Informações sobre o membro | Enviar uma mensagem) http://drgarcia1986.wordpress.com | | Opa Carlos, muito obrigado pelo feedback. Espero que tenha sido realmente útil. Acredito que o "TThread.CreateAnonymousThread" seja implementação do Delphi XE. Sobre os fonte que utilizei para esse artigo, infelizmente, imaturamente eu os deletei após a publicação de todas as partes. Mas posso lhe ajudar caso você precise, só me mande um e-mail que farei o possível para ajudar. Grande Abraço... | [ Comentários não permitidos para usuários anônimos. Por gentileza, registre-se ou conecte-se ao sistema
|
|
Edição 112 |
|
|
50 Programas Fontes |
|
|
Produtos |
|
|